选择一个父项和一个没有额外查询的子项

时间:2014-07-11 10:57:10

标签: ruby-on-rails activerecord

我有两个型号

class Parent < ActiveRecord::Base
  has_many :children
end

class Child < ActiveRecord::Base
  belogs_to :parent
end

我想从每个家长中选择一个孩子,不需要任何额外的查询我需要做什么 我可以通过这些线

来做到这一点
Parent.all.collect{|p| p.children.first}

但这是一种非常差的方法,并且会运行多个查询我需要一个最好的方法,它将返回活动记录列表。

3 个答案:

答案 0 :(得分:2)

以下是执行相同操作的最佳方法,它只会运行两次查询:

Parent.includes(:children).collect { |p| p.children.first }

有关详细信息,请参阅Rails Guide.

中的Eager Loading Associations部分

答案 1 :(得分:1)

我认为您的问题可以通过简单的includes

来解决
Parent.includes(:children).map{|parent| parent.children.first }

这样你就可以对整个循环执行两次查询。

答案 2 :(得分:1)

如果您想获取活动记录对象,请从另一方拨打电话并使用SQL GROUP_BY:

Child.joins(:parent).group(:parent_id)