我有两个模型,让我们称之为父和子,其中
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
然而,由于可能有数百甚至数千个不同的父母,这似乎仍然效率低下。
有更好的方法吗?
答案 0 :(得分:1)
尝试使用pluck
将其推送到数据库children = Children.eager_load(:parent).where(condition).all
parents = children.pluck('distinct parent_id')
修改强>
我误解了这个问题。还有另一种选择,但我不确定它比通过所有这些(如您在问题中显示)或运行多个查询(就像您需要使用{{1}一样)要好得多})。您可以使用pluck
来确保父对象的唯一性:
Set