在使用has_many:through时,给定两个实体的连接模型的最简单方法是什么?

时间:2009-05-26 11:13:24

标签: ruby-on-rails

我正在使用has_many :through指定两个实体之间的多对多关联,我希望能够轻松地从连接表中检索模型。以下是主要实体:

class Group < ActiveRecord::Base
    has_many :memberships
    has_many :members, :through => :memberships
end 

class Member < ActiveRecord::Base
    has_many :memberships
    has_many :groups, :through => :memberships
end 

联接表称为“成员资格”,并具有附加属性“admin”,表示用户可以充当该组的组管理员。这是迁移snippit:

create_table :memberships do |t|
  t.integer :group_id
  t.integer :member_id
  t.boolean :admin

  t.timestamps
end

现在,在我的控制器中,我想检查特定成员是否是某个组的管理员。我目前有以下代码(有效):

membership = @member.memberships.find_by_group_id(@group.id)

我的问题:检索连接对象(成员资格)是否比使用find_by_group_id助手更优雅?

2 个答案:

答案 0 :(得分:4)

你可以问:

  @member.is_admin?(@group)

有这样的事情。

  class Member < ActiveRecord::Base

    has_many :memberships
    has_many :groups, :through => :memberships

    def is_admin?(group)
      memberships.find_by_group_id(group.id).admin?
    end

  end

答案 1 :(得分:4)

使用帮助器方法,你可以写:

  @member.admin?(@group)

有这样的事情(未经测试!)。

  class Member < ActiveRecord::Base

    has_many :memberships
    has_many :groups, :through => :memberships
    named_scope :admin?, :through => :memberships, 
    lambda {|group|:conditions=> ["admin = 'true' and group_id = ?"], group.id }
  end