【问题标题】:Push a hash into an array in a loop rails将散列推入循环轨道中的数组中
【发布时间】: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


【解决方案1】:

您正在循环内初始化数组:
@royaltiesbychannel = Array.new()

每次都会重新初始化,因此您只会得到一个结果。将其移到每个循环之外。

【讨论】:

    【解决方案2】:

    您的@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】:

      在每次迭代 sales_hash_by_channel 期间,您将 @royaltiesbychannel 设置为一个新的 Array 对象,您是否应该改为在该循环之外对其进行初始化一次?

      【讨论】:

      • 嘿@madlep,你能编辑这个答案吗,我不小心点击了反对票,现在它被锁定了。编辑答案后将其还原。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2014-07-10
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      相关资源
      最近更新 更多