2015-01-14 109 views
1

所以我有一個查詢,看起來像這樣:ActiveRecord的包括反方向

merge_groups_with_mems_and_fps = PersonMergeGroup.joins(:members) 
    .where('merge_group_members.member_id IN (?)', member_ids) 
    .includes(:members, :field_preferences) 

和類的關聯:

class FieldPreference < ActiveRecord::Base 
    belongs_to :merge_group 
end 

現在,當我這樣說

merge_groups_with_mems_and_fps.first.field_preferences[0].merge_group 

結果是一個新的查詢。

確保何時調用field_preference並希望其merge_group有什麼好方法,我只查看merge_groups_with_mems_and_fps並且不會創建新查詢?非常感謝你!

回答

0

我想你需要提示的Rails這個協會:

class FieldPreference < ActiveRecord::Base 
    belongs_to :merge_group, inverse_of: :field_preference 
end 

退房的docs。此外,相關SO question

+1

太棒了,看起來像我想在兩側inverse_of。 –

0

您正嘗試調用merge_group關聯,而不將其包含在原始查詢中。除非將其添加到include部分,否則每次在field_preferences集合中的任何元素上引用merge_group時,都會生成一個新查詢。你可能想要的東西,看起來像這樣:

merge_groups_with_mems_and_fps = PersonMergeGroup.joins(:members) 
    .where(merge_group_members: member_ids) 
    .includes(:members, field_preferences: { :merge_group }) 

PS:ActiveRecord的將產生IN查詢你,所以你可以爲你的where查詢指定這些條件哈希參數。

+0

有趣!這兩個merge_groups是不同的對象。謝謝! –