2012-04-26 70 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