Ruby on rails 将两个分组的结果映射到rails中的二维对象

Ruby on rails 将两个分组的结果映射到rails中的二维对象,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个模型,我想分为两列: ModelName.group(:location_id, :referrer).count 其结果是难以处理的对象: { [ '1', 'friend' ] => 100, [ '1', 'family' ] => 23, [ '2', 'friend' ] => 43, [ '2', 'family' ] => 65 } 我想将这些值映射到一个更容易使用的结构,但我无法让它工作。理想的情况是: {

我有一个模型,我想分为两列:

ModelName.group(:location_id, :referrer).count
其结果是难以处理的对象:

{
    [ '1', 'friend' ] => 100,
    [ '1', 'family' ] => 23,
    [ '2', 'friend' ] => 43,
    [ '2', 'family' ] => 65
}
我想将这些值映射到一个更容易使用的结构,但我无法让它工作。理想的情况是:

{
    '1' => {
        'friend' => 100
        'family' => 23
    },
    '2' => {
        'friend' => 100
        'family' => 23
    }
}

我如何才能做到这一点(最好它也适用于第三维)?

您可以将当前输出按每个哈希键进行分组,然后转换哈希值:

data.group_by { |key, _| key.first }
    .transform_values do |values|
      values.each_with_object({}) do |(keys, value), hash|
        hash[keys.last] = value
      end
    end
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}
鉴于:

通过结合一个自动激活哈希,您可以很好地实现这一目标:

desired = Hash.new { |h, k| h[k] = { } }
还有一些嵌套破坏:

original.each_with_object(desired) do |((loc, ref), n), h|
  h[loc][ref] = n
end
desired
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}
或者,如果您不喜欢预先退出所需的

desired = original.each_with_object(Hash.new { |h, k| h[k] = { } }) do |((loc, ref), n), h|
  h[loc][ref] = n
end
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}
或许:

reorg   = ->(((loc, ref), n), h) { h[loc][ref] = n }
desired = original.each_with_object(Hash.new { |h, k| h[k] = { } }, &reorg)
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}

太神了我会尽力遵循这个逻辑,因为这是一个令人印象深刻的数据操作
reorg   = ->(((loc, ref), n), h) { h[loc][ref] = n }
desired = original.each_with_object(Hash.new { |h, k| h[k] = { } }, &reorg)
# {"1"=>{"friend"=>100, "family"=>23}, "2"=>{"friend"=>43, "family"=>65}}