在rails has_many:through中使用join模型属性

时间:2009-08-17 14:17:03

标签: ruby-on-rails activerecord has-many-through

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

他们与:has_many,:through => groups_users

groups_users表有一个名为主持人的属性,指定用户是否是该组的主持人

问题:我如何访问给定组的所有主持人?

阅读:with_scope后,我想到的是

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

然而,在rails 2之后,with_scope变得受保护,并且不允许在控制器中给出代码,那么有什么替代方案呢?

3 个答案:

答案 0 :(得分:3)

解决了

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

首选Matt van Horn的答案,因为当我们使用@ group.moderators选择用户信息时,这个只生成一个查询,而他的解决方案为每个主持人提供单独的查询

编辑:更新以回答Sizzlepants的问题。使用此代码创建的主持人应该将连接模型中的主持人属性设置为true(rails使用:创建连接模型时的条件),如果我现在必须编写代码,我会将groups_users成员资格命名为可读性。

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

猴补丁!

class Group < ActiveRecord::Base
   public :with_scope
end