2011-12-15 135 views
0

我有對象的數組的數組創建總和的數組,看起來像這樣:Ruby on Rails的:從對象

[#<Holding id: 5, user_id: 21, outcome_id: 7, quantity: 200, cost_basis: nil, created_at: "2011-12-15 20:52:05", updated_at: "2011-12-15 20:52:05">, 
#<Holding id: 6, user_id: 21, outcome_id: 7, quantity: 750, cost_basis: nil, created_at: "2011-12-15 21:31:30", updated_at: "2011-12-15 21:31:30">, 
#<Holding id: 7, user_id: 21, outcome_id: 9, quantity: 1231, cost_basis: nil, created_at: "2011-12-15 21:35:31", updated_at: "2011-12-15 21:35:31">] 

我用我的模型的find_all_by_user_id檢索這個(Holding.find_all_by_user_id(21)) 。但是,我需要的是一系列總和。所以,舉例來說,我想獲得,而不是在這種情況下是:

[#<Holding id: 5, user_id: 21, outcome_id: 7, quantity: 950, cost_basis: nil, created_at: "2011-12-15 20:52:05", updated_at: "2011-12-15 20:52:05">, 
    #<Holding id: 7, user_id: 21, outcome_id: 9, quantity: 1231, cost_basis: nil, created_at: "2011-12-15 21:35:31", updated_at: "2011-12-15 21:35:31">] 

什麼會讓它更妙的是,如果我可以從我的成果模型Outcome.description拉,讓它在這個第二數組以及id。我只需要循環並創建其中的outcome_id匹配或有更好的方法?

回答

2

就我個人而言,我會在SQL - SUM(quantity)GROUP BY outcome_id中執行此操作。

如果你想在Ruby中,你可以做

holdings = Holding.find_all_by_user_id(21) 

sums = Hash.new(0) 

holdings.each do |h| 
    sums[h.outcome_id] += h.quantity 
end 

sums現在是關鍵的是所有的outcome_ids並且是總量值的哈希。

請注意,在這兩種解決方案(SQL和Ruby)中,您將失去其他字段(hold_id,user_id,cost_basis,timestamps)中的信息,這可能不是您想要的。

+0

我同意在SQL中這樣做是更好的解決方案。它返回的數據少得多,總是有用的,再加上DBM就是爲這種提升而做的。我唯一需要檢索整行的是如果必須根據總和進行後續的數據處理。 – 2011-12-16 00:15:20