我需要做以下事情:
<% for customer in @customers do %>
<%= customer.orders.count %>
<% end %>
这会使服务器紧张,创建n个查询,其中n =客户数量。
如何在一个查询中将这些计数与我的客户一起加载?感谢。
答案 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作为额外字段。但是,这不会像计数器缓存那样表现得那么好。