0

我一直在使用 arel/rails 并想出了如何让我的 group by statement 正常工作。使用多列它会给出这样的输出

{["column1_value","column2_value","column3_value"]=>count,... etc ...}

将其转换为多级哈希的最佳/最简单方法是什么?例如

{column1_value:{
  column2_value:{
   column3_value1: count,
   column3_value2: count
  }
  column2_value2:{ ...}
 }
 column2_value2: {....}
}

我明白为什么结果是由数组键入的,但它并不是特别容易使用!。

4

2 回答 2

2

或者,如果您更喜欢迭代方法:

a = {[:a, :b, :c]=> 1, [:a, :b, :d]=>2, [:a, :c, :e]=>3}

a.each_with_object({}) { |((*keys, l), v), m|
  keys.inject(m) {|mm, key|
    mm[key] ||= {}
  }[l] = v
}
# {:a=>{:b=>{:c=>1, :d=>2}, :c=>{:e=>3}}}
于 2012-11-28T03:19:24.143 回答
1
def hashify(array, value, hash)
  key = array.shift
  if array.empty?
    hash[key] = value
  else
    hashify(array, value, hash[key] ||= {})
  end
end

a = {[:a, :b, :c]=> 1, [:a, :b, :d]=>2, [:a, :c, :e]=>3}
h = {}
a.each { |k, v| hashify(k, v, h) }

h
# => {:a=>{:b=>{:c=>1, :d=>2}, :c=>{:e=>3}}}
于 2012-11-28T02:11:08.597 回答