باستخدام سمات نموذج الانضمام في القضبان Has_many: من خلال
-
18-09-2019 - |
سؤال
كمثال، لدي مجموعة نموذجية ونموذج المستخدم
وهي متصلة ب: has_many،: من خلال => المجموعات_وس
يحتوي Groups_users Table على سمة، تسمى المشرف، تحديد ما إذا كان المستخدم هو مشرف للمجموعة
سؤال: كيف يمكنني الوصول إلى جميع المشرفين لمجموعة معينة؟
بعد القراءة عن: with_scope، ما يتبادر إلى الذهن هو
def find_moderators
Group.with_scope(:find=>{:conditions => "moderator=1"})
@moderators=@group.users
end
end
ومع ذلك، بعد القضبان 2، يصبح المحمية مع رمز معين في وحدة التحكم، إذن ما هو البديل الجيد لذلك؟
المحلول
حل مع
class Group
has_many :groups_users
has_many :moderatorships, :class_name => "GroupsUser",:conditions => {:moderator => true}
has_many :moderators, :through => :moderatorships, :class_name => "User", :source => :user
end
فضل إجابة مات فان القرن لأن هذه واحدة تنتج استعلام واحد فقط عند تحديد معلومات المستخدم مع @ group.moderators، في حين أن حله يعطي استفسارا منفصلا لكل مشرف
تحرير: تحديث للإجابة على سؤال sizzlepants. يجب أن يكون للمشرفين الذين تم إنشاؤهم مع هذا الرمز سمة مشرف في نموذج الانضمام المحدد إلى TRUE (استخدامات القضبان: الشروط أثناء إنشاء نموذج الانضمام)، أيضا، إذا كان يجب عليك إطلاعه الآن، فسأسم عضوية Groups_users للحصول على قابلية القراءة.
نصائح أخرى
class User
has_many :group_users
has_many :groups, :through => :groups_users
end
class GroupUser
belongs_to :user
belongs_to :group
named_scope :as_moderator, :conditions => "moderator=1"
end
class Group
has_many :group_users
has_many :groups, :through => :groups_users
def moderators
group_users.as_moderator.map{|gu|gu.user}
end
end
# use it:
@moderators = @group.moderators
or
@all_mods = Group.all.map{|g|g.moderators}.flatten
monkepatch!
class Group < ActiveRecord::Base
public :with_scope
end