I'm generating an array of hashes like this:
hash = Modality.joins(:exam).where(exams: {physician_id: physician}).map {|m|
{name: m.name, data: {m.exam.from_date => m.total}}
}
The output:
[
{:name=>"MR", :data=>{Sun, 01 Jan 2017=>44}},
{:name=>"CT", :data=>{Sun, 01 Jan 2017=>7}},
{:name=>"US", :data=>{Sun, 01 Jan 2017=>1}},
{:name=>"MR", :data=>{Wed, 01 Feb 2017=>41}},
{:name=>"CT", :data=>{Wed, 01 Feb 2017=>4}},
{:name=>"MR", :data=>{Wed, 01 Mar 2017=>66}},
{:name=>"CT", :data=>{Wed, 01 Mar 2017=>6}},
{:name=>"XR", :data=>{Wed, 01 Mar 2017=>1}},
{:name=>"CT", :data=>{Sat, 01 Apr 2017=>8}},
{:name=>"US", :data=>{Sat, 01 Apr 2017=>1}},
{:name=>"MR", :data=>{Sat, 01 Apr 2017=>73}}
]
I need to group and merge the data part of the hash based on the name key like this:
[
{:name=>"MR", :data=>{Sun, 01 Jan 2017=>44, Wed, 01 Feb 2017=>41, Wed, 01 Mar 2017=>66, Sat, 01 Apr 2017=>73}}
{:name=>"CT", :data=>{Sun, 01 Jan 2017=>7, Wed, 01 Feb 2017=>4, Wed, 01 Mar 2017=>6, Sat, 01 Apr 2017=>8}}
{:name=>"US", :data=>{Sun, 01 Jan 2017=>1, Sat, 01 Apr 2017=>1, Sun}}
{:name=>"XR", :data=>{Wed, 01 Mar 2017=>1}}
]
I tried reducing and merging like this:
exams = hash.group_by {|d| d[:name]}.map {|k, v| v.reduce(:merge)}
But it's not the desired output:
[
{:name=>"MR", :data=>{Sun, 01 Jan 2017=>44}},
{:name=>"CT", :data=>{Sun, 01 Jan 2017=>7}},
{:name=>"US", :data=>{Sun, 01 Jan 2017=>1}},
{:name=>"XR", :data=>{Wed, 01 Mar 2017=>1}}
]
How would I correctly merge this hash?
See Question&Answers more detail:os