Ruby on Rails:从对象数组中创建一个Sums数组

时间:2011-12-15 21:58:10

标签: ruby-on-rails ruby model-view-controller sum

我有一个对象数组,如下所示:

[#<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匹配的位置创建总数,或者有更好的方法吗?

1 个答案:

答案 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)中的信息,这可能不是您想要的。