Ruby on rails 转换多组结果集的哈希结果

Ruby on rails 转换多组结果集的哈希结果,ruby-on-rails,ruby,arrays,hash,Ruby On Rails,Ruby,Arrays,Hash,这是Product.group([:name,:category]).order([:name,:category]).count的输出: { ["Product A", "Category 2"]=>42, ["Product A", "Category 3"]=>83, ["Product A", "Category 4"]=>47, ["Product B", "Category 2"]=>1, ["Product B", "Category 3

这是
Product.group([:name,:category]).order([:name,:category]).count的输出

{
  ["Product A", "Category 2"]=>42,
  ["Product A", "Category 3"]=>83,
  ["Product A", "Category 4"]=>47,
  ["Product B", "Category 2"]=>1,
  ["Product B", "Category 3"]=>4,
  ["Product B", "Category 4"]=>10,
  ["Product C", "Category 3"]=>2,
  ["Product C", "Category 4"]=>4,
  ["Product D", "Category 1"]=>6,
  ["Product D", "Category 2"]=>13,
  ["Product D", "Category 3"]=>57,
  ["Product D", "Category 4"]=>27
}
每种产品可分为1-4类。我需要有0的计数,以及为最终的转换

所需转换数组列:产品名称、类别1计数、类别2计数、类别3计数和类别4计数:

[
  ["Product A",  0, 42, 83, 47],
  ["Product B",  0,  1,  4, 10],
  ["Product C",  0,  0,  2,  4],
  ["Product D",  6, 13, 57, 27]
]
任意类别名称的另一个选项:

CATEGORY_NAMES = ["Category 1", "Category 2", "Category 3", "Category 4"]

groups.group_by { |(p,_),_| p }.map do |product, prod_groups| 
  sub_groups = Hash[prod_groups.map { |(p, c), v| [c, v] }]
  sub_groups.default = 0
  [product, *CATEGORY_NAMES.map { |c| sub_groups[c] }]
end
# => [["Product A", 0, 42, 83, 47], ["Product B", 0, 1, 4, 10], ["Product C", 0, 0, 2, 4], ["Product D", 6, 13, 57, 27]] 

很好地使用了解构绑定。
CATEGORY_NAMES = ["Category 1", "Category 2", "Category 3", "Category 4"]

groups.group_by { |(p,_),_| p }.map do |product, prod_groups| 
  sub_groups = Hash[prod_groups.map { |(p, c), v| [c, v] }]
  sub_groups.default = 0
  [product, *CATEGORY_NAMES.map { |c| sub_groups[c] }]
end
# => [["Product A", 0, 42, 83, 47], ["Product B", 0, 1, 4, 10], ["Product C", 0, 0, 2, 4], ["Product D", 6, 13, 57, 27]]