2012-04-26 18 views
0

ルビー、ルビー1.9.3ルビーアレイGROUP_BYネストされたハッシュ値フィールド

IはSiz.requirements.all(モデル) モデルフィールド(SIZ、heigth、wigth、KOL)からの配列データを有します

[{:siz=>10, :heigth = 30, :wigth = 20, :kol = 24}, 
{:siz=>10, :heigth = 30, :wigth = 10, :kol = 24}, 
{:siz=>10, :heigth = 30, :wigth = 20, :kol = 33}, 
{:siz=>10, :heigth = 20, :wigth = 20, :kol = 3}, 
{:siz=>10, :heigth = 20, :wigth = 20, :kol = 5},... 

例えばフィールド によってグループとの配列やハッシュを作成する方法:これは、データベースから来ている場合

[{:siz=>10 => {:heigth=>"30" => {:wigth=>"20" => {:sum_kol => sum(kol)}}},   
{:siz=>10 => {:heigth=>"30" => {:wigth=>"10" => {:sum_kol => sum(kol)}}}, 
{:siz=>10 => {:heigth=>"20" => {:wigth=>"20" => {:sum_kol => sum(kol)}}}] 
+2

あなたの質問はあまり明確ではありません。あなたはあなたのインプットと期待されるアウトプットが何であるかをより良い例で示すことができますか? – d11wtq

+0

が編集されました。 – memoris

+0

は次のとおりです:siz、:heigth、:wigth、:kol:size、:height、:width、および:col? ネスティング構造がわかりません。実際に同じサイズのすべての要素を1つの要素に結合しているわけではないので、入れ子はいくらか意味がないようです。 '{10 => {20 => {20 =>合計}、30 => {10 =>合計、20 =>合計}}}' –

答えて

5

が、私はGRを行うには、データベースを使用して見ますあなたのためにoupingと要約。しかし、デフォルトを積んだと

summary = raw_data.reduce(Hash.new do Hash.new do Hash.new do 0 end end end) 
do |summary,rec| 
    size, height, width, col = rec.values_at(:siz,:heigth,:wigth,:kol) 
    summary[size][height][width] += col 
    summary 
end 

通常
raw_data = [ {:siz=>10, :heigth => 30, :wigth =>20, :kol =>24}, 
      {:siz=>10, :heigth =>30, :wigth =>10, :kol =>24}, 
      {:siz=>10, :heigth =>30, :wigth =>20, :kol =>33}, 
      {:siz=>10, :heigth =>20, :wigth =>20, :kol =>3}, 
      {:siz=>10, :heigth =>20, :wigth =>20, :kol =>5} ] 

# create a hash that defaults to three levels of nested hash values, 
# with 0s at the leaves 
summary = Hash.new do Hash.new do Hash.new do 0 end end end  

# populate it 
raw_data.each do |rec| 
    size, height, width, col = rec.values_at(:siz,:heigth,:wigth,:kol) 
    summary[size][height][width] += col 
end 

summary # => {10=>{30=>{20=>57, 10=>24}, 20=>{20=>8}}} 

それはRubyでより多くの慣用ではなく、初期化+更新ループのinject/reduceを使用するでしょう。しかし、ここではRubyでそれを行うための一つの方法ですハッシュとreduceブロックの終わりにハッシュを返す必要性、私は元のバージョンがここできれいだと思います。

+0

非常にうまく@MarkReed。しかしvalues_atはメソッドエラーではありません。私はこの行をリファクタリングしています。 Theryは感謝します。 – memoris

+0

? values_atは、間違いなくruby 1.8+のHashの有効なメソッドです。問題が発生した場合は、チャットセッションを開始できます。 –

+0

ありがとうございます、私たちは問題を解決しました。 – memoris

関連する問題