2010-09-09 27 views
1

我需要做到以下幾點:在一個查詢中收集很多'計數'?

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

這株服務器,創建N個查詢,其中n =客戶數量。

我怎麼能在一個查詢中加載這些計數客戶與我一起去嗎?謝謝。

回答

2

你可以使用一個渴望加入:

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

通過指定:包括參數的加入,該訂單將被預裝,防止N + 1的問題。然後你可以使用customer.orders.length。

如果加載所有這些訂單是太內存密集型的,那麼你應該探索counter_cache。這是爲了保持模型的數量上的相關型號:

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

這將增加和訂單時添加或從associaition取消了對擁有customer記錄遞減orders_count場。

如果你不想使用counter_cache,你需要自定義查找SQL它連接上orders.customer_id訂單表和組,然後選擇計數作爲一個額外的字段。儘管如此,這將不會像計數器緩存那麼好。