هل يجب أن يكون هذا has_many: من خلال الارتباط؟
-
23-09-2019 - |
سؤال
منشور ينتمي إلى مستخدم ، ومستخدم مشاركات has_many.
ينتمي المنشور أيضًا إلى موضوع ، وموضوع HAS_MANY.
class User < ActiveRecord::Base
has_many :posts
end
class Topic < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :user
belongs_to :topic
end
حسنًا ، هذا بسيط للغاية وسهل الإعداد ، ولكن عندما أعرض موضوعًا ، لا أريد فقط جميع المنشورات لهذا الموضوع ، ولكن أيضًا user_name و user_photo للمستخدم الذي قام بهذا المنشور. ومع ذلك ، يتم تخزين هذه السمات في نموذج المستخدم وليس مرتبطة بالموضوع. إذن كيف يمكنني إعداد ذلك؟
ربما يمكن استدعاؤه بالفعل لأن نموذج البريد يحتوي على مفتاحين أجنبيين ، أحدهما للمستخدم والآخر للموضوع؟
أو ربما يكون هذا نوعًا من "اتجاه واحد" HAS_MANY من خلال التمييز. مثل المنشور سيكون نموذج JOIN ، وسيقوم موضوع HAS_MANY: المستخدمين ،: من خلال =>: المنشورات. لكن عكس هذا غير صحيح. مثل المستخدم لا has_many: موضوعات.
فهل يجب أن يكون هذا حتى هواني: على الرغم من الارتباط؟ أظن أنني في حيرة من أمري بعض الشيء على ما يبدو أن وحدة التحكم في استدعاء كل من المنشور ومستخدم هذا المنشور لموضوع إعطاء.
تحرير: على محمل الجد ، شكرًا لك على كل ما تم وزنه. اخترت إجابة Tal لأنني استخدمت رمزه لوحدة التحكم الخاصة بي ؛ ومع ذلك ، كان بإمكاني اختياره بسهولة إما j. أو تيم بدلاً من ذلك. شكرا لكما كذلك. كان هذا بسيط جدا لتنفيذ. أعتقد أن اليوم قد يمثل بداية علاقة حبي مع القضبان.
المحلول
حسنًا ، إذا كان ما تريده هو عرض اسم مستخدم مؤلف منشور ، على سبيل المثال ، يمكنك القيام بشيء مثل (لم يتم اختباره ، ولكن يجب أن يعمل):
@posts = topic.posts.all(:include => :user)
يجب أن تقوم بإنشاء طلب واحد لجميع المنشورات ، ووريد للمستخدمين ، ويجب أن يكون لمجموعة المشاركات مستخدمين.
في عرض (هامل هنا):
- @posts.each do |post|
= post.user.name
= post.body
نصائح أخرى
يمكنك الحصول على user_name
و user_photo
عند عرض موضوع ومشاركاته ...
شيء مثل:
@topic.posts.each do |post|
user_name = post.user.name
user_photo = post.user.photo
end
انه سهل. آسف إذا لم أفهم سؤالك جيدًا.
إذا فهمت سؤالك بشكل صحيح ، لا ، A has_many: من خلال الارتباط غير مطلوب هنا.
إذا كنت ترغب في عرض قائمة بجميع المستخدمين الذين نشروا في موضوع (تخطي معلومات النشر) ، فسيكون ذلك مفيدًا.
سترغب في حريص تحميل المستخدمين من المنشورات ، على الرغم من منع استفسارات N+1.