2011-05-25 54 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時,你應該來代替初始化一次該循環,而不是外面?