将组计数从activerecord转换为具有多个组阶段的哈希

时间:2016-07-07 10:46:16

标签: ruby-on-rails ruby activerecord rails-activerecord

我正在尝试获取一些统计数据。

Model.where(status:@statuses).group(:sub_group, :status).count

这会让我回头

{
  ["sub_group1", "status1"] => 3},
  ["sub_group2", "status3"] => 7,
  ["sub_group1", "status2"] => 5, ....etc }

我想合并它们,因此每个元素都有一个唯一的子组。

e.g。哈希如:

{
  "sub_group1" => {"status1" => 3, "status2" => 5,
  "sub_group2" => {"status3" => 7},
}

或数组

[
  ["subgroup1", {"status1" = 3, "status2" => 5}],
  ["subgroup2".....

]

即。我希望将所有这些术语与sub_group合并为主标题,以便我可以在一个项目中获得子组的结果。

大脑今天不工作......

4 个答案:

答案 0 :(得分:1)

您可以尝试merge!

result = Model.where(status: @statuses).group(:sub_group, :status).count

result.reduce({}) do |collection, (attributes, count)| 
  collection.merge!(attributes[0] => { attributes[1] => count }) do |_, prev_value, next_value| 
    prev_value.merge!(next_value)
  end
end

Demonstration

答案 1 :(得分:0)

我想你可以这样做:

res = Model.where(status:@statuses).group(:sub_group, :status).count
nice_hash = {}
res.each do |key, count|
  nice_hash[key[0]] = {} unless nice_hash[key[0]]
  nice_hash[key[0]][key] = count
end

nice_hash后应采用所需格式

答案 2 :(得分:0)

请尝试使用以下代码。

structs

答案 3 :(得分:0)

我相信你的问题的答案应该是这个或者这应该指引正确的方向:

Model.where(status:@statuses).group_by(&:sub_group)

如果你只需要你提到的状态,你可以这样做:

Model.where(status:@statuses).select(:status, :sub_group).group_by(&:sub_group)