Обработка 1000 строк в цикле .each. Как вывести сообщение о путе через каждые 100 элементов? - PullRequest
0 голосов
/ 18 ноября 2010

Я обрабатываю 1000 пользовательских объектов в цикле .each.

Я хочу вывести сообщение о путях для обратной связи на консоль.

Как я могу это сделать, Что такое оператор модуля Ruby?

Я пытался:

if u.id % 100
   puts u.id.to_s
end

Ответы [ 4 ]

7 голосов
/ 18 ноября 2010

Попробуйте это:: -)

if u.id % 100 == 0
   puts u.id.to_s
end
5 голосов
/ 18 ноября 2010

Это зациклится 2000 раз, выводя стандартное сообщение каждые 100 циклов:

1.upto(2000).with_index do |j,i|
  print "line #{i}\r" if (i % 100 == 0)
end
print "\ndone\n"

Альтернативы для индикатора прогресса такого типа:

print '.' if (i % 100 == 0)

или простой счетчик:

spinner = %w[ | / - \\ ]
1.upto(n).with_index do |j,i|
  print spinner.rotate![0], "\r" if (i % 100 == 0)
  # some long running task
end
print "\ndone\n"

ПРИМЕЧАНИЕ - Если ваш .id исходит из объекта ActiveRecord, созданного чтением строки в базе данных, то вы можете получить сильно изменяющиеся выходные данные при цикле, если вашсортировка не основана на столбце id.Кроме того, если ваша база данных существует некоторое время и вы удаляете строки, у вас могут быть пропуски id чисел.Конечный результат - ваши «каждые 100» могут быть очень неточными.

Я бы порекомендовал не сравнивать с id и вместо этого использовать отдельную переменную, которую вы увеличиваете при зацикливании, или использовать each_with_index или Enumerable * with_index, чтобы предоставить вам последовательно увеличивающееся число, которое вы можете использовать дляваш % 100 == 0 тест.

1 голос
/ 18 ноября 2010

Вы можете использовать .each_slice вместо .each:

rows.each_slice(100) do |slice|
    slice.each do |row|
        ....
    end
    puts message
end
0 голосов
/ 18 ноября 2010

Перечислите последовательность объектов и проверьте, равен ли индекс% 100 99 (или некоторому другому значению от 0 до 99 включительно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...