0

ルビー オン レール 3.2.2、ルビー 1.9.3

Siz.requirements.all (モデル) モデル フィールド (サイズ、高さ、幅、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)}}}]
4

1 に答える 1

5

これがデータベースからのものである場合、データベースを使用してグループ化と要約を行うことを検討します。しかし、Ruby でそれを行う 1 つの方法を次に示します。

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

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

しかし、デフォルトを含んだハッシュと、reduce ブロックの最後にハッシュを返す必要があるため、ここでは元のバージョンの方がクリーンだと思います。

于 2012-04-26T16:48:06.007 に答える