2013-01-17 28 views
4

我有一个:has_many => :through关系相关的几种模式:使用活动记录,以查找连接表

class User < ActiveRecord::Base 
    has_many :group_members 
    has_many :groups, :through => :group_members 
end 

class Group < ActiveRecord::Base 
    has_many :group_members 
    has_many :users, :through => :group_members 
end 

class GroupMembers < ActiveRecord::Base 
    belongs_to :group 
    belongs_to :user 
end 

很容易找到的组和用户之间的关系用ActiveRecord:

groups = @user.groups 
users = @group.users 

但什么如果我想查找组和用户共享的连接表?现在我能想出的最佳解决方案是使用类方法。例如,在用户模式中,我有:

def group_member_for(group) 
    self.group_members.where(:group_id => group.id).first 
end 

这工作正常,但我怀疑有一个更清洁的方法。也许甚至是直接使用ActiveRecord关联的方法。喜欢的东西:

group_member = @user.groups.group_member 

回答

6

您只需做到以下几点:

user.group_members 
# and 
group.group_members 
# or 
GroupMember.where(user_id: user.id, group_id: group.id) 
+1

谢谢!看起来我并不太离谱。 – nullnullnull

+1

前两位怎么做OP的要求?这对我来说似乎很不一样? –

+2

Rails没有像'user.group_members(group)'这样的便捷方法来获取相关记录,这似乎很愚蠢。 –