ActiveRecord 包括反向

ActiveRecord includes reverse direction

所以我有一个如下所示的查询:

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

以及协会的class:

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 并且不进行新查询?非常感谢!

您正在尝试调用 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 查询的哈希参数。

我认为你需要向 Rails 暗示这个关联:

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

查看 docs. Also, related SO question