読者です 読者をやめる 読者になる 読者になる

モデルの属性毎に合計値を計算したい場合

# = アイテムクラス =
class Item
  attr_accessor :name, :price

  # コンストラクタ
  def initialize(name, price)
    self.name = name
    self.price = price
  end
end

# Itemクラスの配列
items = [
  Item.new('item_1', 10), Item.new('item_1', 100),
  Item.new('item_2', 20), Item.new('item_2', 200),
  Item.new('item_3', 30), Item.new('item_3', 300)
]

# itemsのような配列で、name毎にpriceの合計を計算したい場合
# 以下のようにすると計算できます。

result = {}
items.group_by(&:name).each do |name, targets|
  sum = 0
  # RubyではArrayクラスにsumメソッドはないので、eachメソッドを使いました。
  targets.each{|item| sum += item.price }
  result[name] = sum
end

p result

# これで下のような結果が得られます。
# result => {"item_1"=>110, "item_2"=>220, "item_3"=>330}