oprogfrogo
oprogfrogo

Reputation: 2074

Ruby on Rails - Hash of Arrays, group by and sum by column name

I have the following array of hashes:

[{"idx"=>"1234", "account"=>"abde", "money"=>"4.00", "order"=>"00001"}, {"idx"=>"1235", "account"=>"abde", "money"=>"2.00", "order"=>"00001"}, {"idx"=>"1235", "account"=>"abde", "money"=>"3.00", "order"=>"00002"}]

Like how sql does it, I'd like to take that array of hashes and group it by the order number so that it results like this where order 00001 is grouped and it sum the money to 6.00:

[{"idx"=>"1234", "account"=>"abde", "money"=>"6.00", "order"=>"00001"}, {"idx"=>"1234", "account"=>"abde", "money"=>"3.00", "order"=>"00002"}]

Thanks.

Upvotes: 0

Views: 1677

Answers (1)

alony
alony

Reputation: 10823

you can make your own method for that, something like:

def group_hashes arr, group_field, sum_field
  arr.inject({}) do |res, h|
    (res[h[group_field]] ||= {}).merge!(h) do |key, oldval, newval|
      key.eql?(sum_field) ? (oldval.to_f + newval.to_f).to_s : oldval
    end
    res
  end.values
end

a call group_hashes arr, "order", "money" on you array of hashes example returns:

[{"idx"=>"1234", "account"=>"abde", "money"=>"6.0", "order"=>"00001"}, {"idx"=>"1235", "account"=>"abde", "money"=>"3.00", "order"=>"00002"}]

Upvotes: 3

Related Questions