【发布时间】:2011-09-01 16:20:28
【问题描述】:
我试图在遍历每个循环时将哈希添加到数组中。这是我的控制器代码:我正在努力解决的问题是在每个循环中设置 @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 如何工作的要点?提前谢谢了。
【问题讨论】:
-
一方面,你应该把所有的逻辑都放在你的模型中:)
-
确实如此。我想知道先让这个东西工作然后重构......
-
@royaltiesbychannel = @royaltiesbychannel value_total_by_channel * 0.5} 你为什么将roytiesbychannel 等同于它自己?您可以不使用 = 符号,这可能就是您要覆盖的地方
-
也许您可以先重构并修复该过程中的错误 :) 将其重构为更清晰、更易于理解的代码可以为您解决问题,向您展示为什么它一开始就不起作用 :)
-
另外,您的方法中有一个 isbn 参数,但您没有使用它?
标签: ruby-on-rails arrays ruby-on-rails-3 loops hash