2014-07-11 54 views
1

我有两个型号选择一个家长和一个孩子了额外查询

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belogs_to :parent 
end 

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

Parent.all.collect{|p| p.children.first} 

做到这一点,但是这是一个方法非常差d会运行多个查询我需要一个最好的方式这将返回活动记录列表。

回答

1

Eager Loading Associations节。如果你想获得活动记录对象然后使从对方UND使用SQL GROUP_BY您的来电:

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

是的,这是正确的谢谢 –

1

我觉得你的问题可以用一个简单的includes

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

要解决这样你将执行两个查询整个循环。

+0

喜xlembouras这将加载所有的孩子从所有我想要的只是一个E中的父非常的父母和只有一个孩子从数据库加载。 –

+0

这会返回一个数组我想要活动记录对象 –

2

以下是做同样的事情,最好的方法,它会运行查询只是两次:

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

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

+0

这会返回一个数组我想要活动记录对象。 –

相关问题