作为一个例子,我有一个模型组和模型用户

它们与连接:的has_many,:通过=> groups_users

groups_users表具有一个属性,称为慢化剂,指定用户是否是该组的慢化剂

的问题:如何访问一个给定组的所有调节剂

阅读后:with_scope,想到什么是

def find_moderators
 Group.with_scope(:find=>{:conditions => "moderator=1"})
   @moderators=@group.users
 end
end

然而,轨道2后,with_scope变得保护,并且不会在控制器允许给定的代码,所以什么是很好的替代吗?

有帮助吗?

解决方案

与解决

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(Rails使用:条件,同时建立连接模型),另外,如果我不得不现在它的代码,我会为命名可读性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

猴补丁!

class Group < ActiveRecord::Base
   public :with_scope
end
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top