2011-07-13 103 views
2

模型的3 ActiveRecord的總和我有2種型號Rails的每一個關聯的模型

Category 
- id 
- name 

Transaction 
- id 
- category_id 
- amount 

我要找到每個類別中的所有交易的總和。 我知道我可以得到caterogies列表,然後獲得與category_id的所有交易的總和,但它會做20個以上的查詢。

有沒有辦法在一個查詢中做到這一切?

編輯:我想最終列出[[category1,sum],[category2,sum]]。

回答

8
Transaction.group(:category_id).sum(:amount) 

這將返回類似下面的哈希:

{CATEGORY_ID => SUM_OF_TRANSACTIONS, ....} 

{1 => 100.0, 2 => 350.0, etc.} 

要獲得實際Category名稱:

Transaction.includes(:category).group("categories.name").sum(:amount) 
# => {"Category1" => 100.0, ...} 
+0

有沒有簡單的方法來獲取類別名稱,或者我必須單獨查詢? – marto

+0

我已經停在這個地方:)如何得到它的名字 – fl00r

+0

簡單,看到編輯答案。 –

0
@category.transactions.sum(:amount) 

UPD 1

你可以分享一些工作與紅寶石:

Category.includes(:transactions).map{|c| [c.name, c.transactions.inject(0){|sum, t| sum += t.amount}]} 
+0

這會給我的交易金額爲1類。有沒有辦法爲他們做同樣的事情? – marto

+0

哦,對不起。我現在編輯我的答案:) – fl00r

+1

對於一些使用Ruby的想法絕對適用於小數據集,而沒有任何明顯的速度下降,但它會變得痛苦地緩慢的大數據集它需要遍歷每一個事務。 –