0

私はarel/railsを使用していて、ステートメントによってグループを正しく機能させる方法を理解しました。複数の列を使用すると、次のような出力が得られます

{["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 に答える