2011-05-25 53 views
0

我试图在通过每个循环迭代时将散列添加到数组。这里是我的控制器代码:我与挣扎的线路设置@royaltiesbychannel变量在每次循环:将散列推入循环中的数组中

def royalty(isbn) 
sales_hash_by_channel = Sale.find_all_by_isbn_id(@isbn).group_by(&:channel_id) 
sales_hash_by_channel.each do |ch_id, sale_array| 
    @royaltiesbychannel = Array.new() 
    value_total_by_channel = sale_array.sum(&:value) 
    quantity_total_by_channel = sale_array.sum(&:quantity)  
    @isbn.rules.each do |rule| 
    next unless rule.channel_id == ch_id 
    case quantity_total_by_channel 
    when 0..5000 
    @royaltiesbychannel = @royaltiesbychannel << {ch_id => value_total_by_channel * 0.5} 
    # (some other case-when statements)    
    end 
end 
end 

在控制台中,当我设置ch_id和价值,新的东西,推新值入阵:

@royaltiesbychannel = @royaltiesbychannel << {ch_id => value_total_by_channel * 0.5} 

我得到散列的很好的数组:

[{1=>100000.0}, {2=>3000.0}] 

然而,当我在视图中做@ royaltiesbychannel.inspect,我得到的只是一个键 - 值对:

[{2=>3000.0}] 

对于裁判:

@royaltiesbychannel.class = Array 
@royaltiesbychannel.class = 1 
@sales_hash_by_channel.class = Hash 
@sales_hash_by_channel.size = 2 
@isbn.rules.size = 4 

所以它看起来像推入阵列覆盖,而不是增加。我究竟做错了什么?我完全错过了循环和.push的工作原理吗?提前谢谢了。

+2

首先,你应该把所有的逻辑放在你的模型中:) – corroded 2011-05-25 11:28:18

+1

所以如此。我想知道让事情先工作然后重构... – snowangel 2011-05-25 11:30:25

+0

@royaltiesbychannel = @royaltiesbychannel << {ch_id => value_total_by_channel * 0.5}你为什么要将渠道的版税等同于自己?你可以不使用=符号,这可能是你覆盖了 – corroded 2011-05-25 11:32:04

回答

1

您的@royaltiesbychannel初始化位于第一个循环内部,因此每次启动该循环时都会清空该数组。将它移到循环之外,你应该得到你想要的结果。

def royalty(isbn) 
    @royaltiesbychannel = Array.new() 
    sales_hash_by_channel = Sale.find_all_by_isbn_id(@isbn).group_by(&:channel_id) 
    sales_hash_by_channel.each do |ch_id, sale_array| 
    value_total_by_channel = sale_array.sum(&:value) 
    quantity_total_by_channel = sale_array.sum(&:quantity)  
    @isbn.rules.each do |rule| 
     next unless rule.channel_id == ch_id 
     case quantity_total_by_channel 
     when 0..5000 
     @royaltiesbychannel = @royaltiesbychannel << {ch_id => value_total_by_channel * 0.5} 
     # (some other case-when statements)    
     end 
    end 
    end 
3

要初始化循环内的数组:
@royaltiesbychannel = Array.new()

它被每一次重新初始化,所以你只能得到一个结果。将它移到每个循环之外。

2

你设置@royaltiesbychannel到一个新的Array对象每次迭代过sales_hash_by_channel时,你应该来代替初始化一次该循环,而不是外面?