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}}