باستخدام سمات نموذج الانضمام في القضبان Has_many: من خلال

StackOverflow https://stackoverflow.com/questions/1288186

سؤال

كمثال، لدي مجموعة نموذجية ونموذج المستخدم

وهي متصلة ب: 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top