這是我現在遇到過很多次的事情,我很想知道如何做我想做的事情,或者建立並向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