过滤has_many / belongs_to关系的子项,并获取所有父项

时间:2016-04-28 20:00:27

标签: ruby-on-rails activerecord

我有两个模型,让我们称之为父和子,其中

class Parent < ActiveRecord::Base
    has_many :child
end

class Child < ActiveRecord::Base
    belongs_to :parent
end

对于API,我感兴趣的是返回一个匹配特定条件的所有Child对象的列表,以及父ID和它们对应的父对象(但只有已过滤子对象的父对象!)而不重复。< / p>

类似的东西:

{children: [{id: 1, parent_id: 20, attr1: x, attr2: y},...], parents: [{id: 20, attr3: z, attr4: w},...]}

最有效的方法是什么?

我尝试过:

children = Child.eager_load(:parent).where(condition).all
parents = children.map(&:parent).uniq{|p| p.id}

但是map和uniq的使用似乎既缓慢又浪费?

或者,我可以用两个SQL查询分别查询它们,即

children = Child.where(condition).all
parent_ids = children.map(&:parent_id)
parents = Parent.where(id: parents_ids).all

然而,由于可能有数百甚至数千个不同的父母,这似乎仍然效率低下。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

尝试使用pluck

将其推送到数据库
children = Children.eager_load(:parent).where(condition).all
parents = children.pluck('distinct parent_id')

修改

我误解了这个问题。还有另一种选择,但我不确定它比通过所有这些(如您在问题中显示)或运行多个查询(就像您需要使用{{1}一样)要好得多})。您可以使用pluck来确保父对象的唯一性:

Set