Вставить хеш в массив в цикле рельсы - PullRequest
0 голосов
/ 25 мая 2011

Я пытаюсь добавить хэши в массив, повторяя каждый цикл.Вот мой код контроллера: строка, с которой я борюсь, устанавливает переменную @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?Спасибо заранее.

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

Вы инициализируете массив в цикле:
@royaltiesbychannel = Array.new()

Он каждый раз переинициализируется, поэтому вы получаете только один результат.Переместите его за пределы каждой петли.

1 голос
/ 25 мая 2011

Вы устанавливаете @royaltiesbychannel для нового объекта Array во время каждой итерации через sales_hash_by_channel, вместо этого следует вместо этого инициализировать его один раз за пределами этого цикла?

1 голос
/ 25 мая 2011

Ваша инициализация @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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...