我正在使用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
助手更优雅?
答案 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