我有一个对象数组,如下所示:
[#<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">]
如果我能从Outcomes模型中获取Outcome.description并将其与id一起放在第二个数组中,那将会更好。我是否只需要循环并在outcome_id匹配的位置创建总数,或者有更好的方法吗?
答案 0 :(得分: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
现在是一个散列,其中key是所有outcome_ids,值是总数量。
请注意,在两个解决方案(SQL和Ruby)中,您将丢失其他字段(holding_id,user_id,cost_basis,timestamps)中的信息,这可能不是您想要的。