这是我现在遇到过很多次的事情,我很想知道如何做我想做的事情,或者建立并向Rails提交补丁。在我的应用程序很多时候,我还会有一些模型,看起来像这样:如何通过关联对象的相关联接模型访问has_many:无附加查询?
class User < ActiveRecord::Base
has_many :memberships
has_many :groups, through: :memberships
end
class Membership
belongs_to :user
belongs_to :group
def foo
# something that I want to know
end
end
class Group
has_many :memberships
has_many :users, through: :memberships
end
我希望能够做的是从一个电话访问相关会员向协会没有做额外的查询。举例来说,我想到做这样的事:
@group = Group.first
@group.users.each do |user|
membership = user.membership # this would be the membership for user in @group
end
是否有Rails的东西,使这个?因为我知道,以达到我说的是结果的唯一方法是非常丑陋的,效率低下,这样的事情:
@group.users.each do |user|
membership = Membership.where(group_id: @group.id, user_id:user.id).first
end
是否ActiveRecord的具有内置的设施有些晦涩难懂,以实现这一目标?它似乎不会太难,它已经必须获取连接模型,以便正确检索关联,所以如果这个功能不存在,在我看来它应该。我遇到过很多次了,我准备卷起袖子解决问题。我能做什么?
更新:其他模式为这个,我可以使用,基本上得到我想要的东西是这样的:
@group.memberships.includes(:user).each do |membership|
user = membership.user
end
但从美学角度,因为我不是其实我不喜欢这样的解决方案对成员资格非常感兴趣,因为我是用户,对迭代加入模型而不是关联目标感觉不对。但是,这比我上面提到的其他方式要好得多(感谢Intridea的Ian Yang提醒我注意这一点)。
我打算让这个打开一下,看看有没有干净呃方式去做,但我爱你的小肮脏的黑客。 :) – 2011-06-16 03:14:21