在一个查询中收集许多“计数”?

时间:2010-09-09 02:16:48

标签: ruby-on-rails

我需要做以下事情:

<% for customer in @customers do %>
  <%= customer.orders.count %>
<% end %>

这会使服务器紧张,创建n个查询,其中n =客户数量。

如何在一个查询中将这些计数与我的客户一起加载?感谢。

1 个答案:

答案 0 :(得分:2)

您可以使用热切加入:

@customers = Customers.paginate :page => 1, :per_page => 20, :include => [:orders]

通过为连接指定:include参数,将预加载订单,防止出现n + 1问题。然后,您可以使用customer.orders.length。

如果加载所有这些订单的内存过于密集,那么您应该探索counter_cache。这旨在保持关联模型上的模型计数:

class Order
  belongs_to :customer, :counter_cache => true
end

当在关联中添加或删除订单时,这将增加和减少拥有orders_count记录中的customer字段。

如果您不想使用counter_cache,则需要自定义查找器SQL,它连接orders.customer_id上的orders表和组,然后选择count作为额外字段。但是,这不会像计数器缓存那样表现得那么好。