Ruby SQL结果分组哈希

时间:2017-04-04 17:40:11

标签: sql arrays json ruby

我从专有数据库中获取数据(Sybase Advantage ADS) 通过自编写的API,利用PHP并将结果作为JSON返回

所以我有一个看起来像这样的结果

[   
  {"year"=>"2016", "month"=>"1", "total"=>"1223"},  
  {"year"=>"2016", "month"=>"2", "total"=>"613"},   
  {"year"=>"2016", "month"=>"3", "total"=>"12351"},  
  {"year"=>"2017", "month"=>"1", "total"=>"123123"},   
  {"year"=>"2017", "month"=>"2", "total"=>"613123"},
  {"year"=>"2017", "month"=>"3", "total"=>"123"}
]

这是我在Ruby中检索的,现在为了使用Date我想创建一个像这样的Hash:

[  
  {:name => "2017", :data => {"1" => 123123, "2" => 613123, "3" => 123}},  
  {:name => "2016", :data => {"1" => 1223, "2" => 613, "3" => 12351}}  
]

这个大数组是按年份键分割和合并的,每个组合包含月份和总数。

此外,我想利用月份的值作为总数的关键。

任何帮助我入门的帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

您将需要开始使用Ruby的#group_by方法,该方法将按行分组行,将年份作为键和匹配行的数组作为值:

>> groups = result.group_by { |row| row['year'] }
=> {"2016"=>
  [{"year"=>"2016", "month"=>"1", "total"=>"1223"},
   {"year"=>"2016", "month"=>"2", "total"=>"613"},
   {"year"=>"2016", "month"=>"3", "total"=>"12351"}],
 "2017"=>
  [{"year"=>"2017", "month"=>"1", "total"=>"123123"},
   {"year"=>"2017", "month"=>"2", "total"=>"613123"},
   {"year"=>"2017", "month"=>"3", "total"=>"123"}]}

接下来,您将使用#map转换您的数据:

>> grouped_rows = groups.map { |year, values| {name: year, data: values.map { |value| [value['month'], value['total']] }.to_h} }
=> [{:name=>"2016", :data=>{"1"=>"1223", "2"=>"613", "3"=>"12351"}},
 {:name=>"2017", :data=>{"1"=>"123123", "2"=>"613123", "3"=>"123"}}]

如果您希望按行显示排序的行,则可以通过在结果上调用#sort_by来完成:

>> grouped_rows.sort_by { |row| -row[:name].to_i }
=> [{:name=>"2017", :data=>{"1"=>"123123", "2"=>"613123", "3"=>"123"}},
 {:name=>"2016", :data=>{"1"=>"1223", "2"=>"613", "3"=>"12351"}}]