Ruby on Rails: создайте массив сумм из массива объектов - PullRequest
0 голосов
/ 16 декабря 2011

У меня есть массив объектов, который выглядит следующим образом:

[#<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 и получить ее вэтот второй массив вместе с идентификатором.Должен ли я просто зацикливаться и создавать суммы в случае совпадения output_id или есть лучший способ?

1 Ответ

2 голосов
/ 16 декабря 2011

Лично я бы сделал это в 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 теперь является хешем, ключом которого являются все result_ids, а значением - общее количество.

Обратите внимание, что в обоих решениях (SQL и Ruby) вы потеряете информацию в других полях (holding_id, user_id, cost_basis, timestamps), что может быть не тем, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...