2011-12-15 176 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