سؤال

منشور ينتمي إلى مستخدم ، ومستخدم مشاركات 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top