ActiveRecord包括反向

时间:2015-01-14 22:49:03

标签: ruby-on-rails 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并且不进行新查询?非常感谢你!

2 个答案:

答案 0 :(得分:0)

您尝试调用merge_group关联而不将其包含在原始查询中。除非您将其添加到include部分,否则每次在merge_group集合中的任何元素上引用field_preferences时,都会生成新的查询。你可能想要这样的东西:

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查询的哈希参数。

答案 1 :(得分:0)

我认为您需要向Rails提供有关此关联的提示:

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

查看docs。此外,相关SO question