2012-04-26 96 views
0

Ruby on Rails的3.2.2,紅寶石1.9.3紅寶石陣列GROUP_BY嵌套散列和字段

我已經從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 2012-04-26 13:52:55

+0

編輯,現在okey? – memoris 2012-04-26 16:21:44

+0

是:siz,:heigth,:wigth和:kol應該是:size,:height,:width和col: 我不明白你的嵌套結構;你實際上並沒有將所有具有相同大小的元素合併到一個元素中,所以嵌套看起來有些沒有意義。似乎有更多的東西像'{10 => {20 => {20 => sum},30 => {10 => sum,20 => sum}}} – 2012-04-26 16:29:11

回答

5

如果這是從一個數據庫來了,我想看看使用數據庫做GR ouping併爲你彙總。但這裏是做在Ruby中的一種方式:

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塊的末尾返回散列,我認爲原始版本在這裏更清晰。

+0

非常好@MarkReed。但是values_at不是方法錯誤。我正在重構這一行。特里謝謝。 – memoris 2012-04-27 02:48:48

+0

?在ruby 1.8+中,values_at絕對是一個有效的Hashes方法。如果您遇到問題,我們可以啓動聊天會話。 – 2012-04-27 03:17:06

+0

謝謝各位,我們已經解決了這個問題,繼續前進。 – memoris 2012-04-27 16:48:14