#ruby-on-rails #ruby #dry
#ruby-on-rails #ruby #сухой
Вопрос:
Я хочу извлекать 5 записей одновременно в представление (я использую rails 2.3.8).
Я использую will_paginate, и он отлично работает, но:
Я хочу отправить эти результаты в представление по 5 записей за раз, затем добавить div, а затем перебирать их до тех пор, пока все они не будут показаны.
Я пытался использовать find_in_batches
, но я не знаю, как получить доступ к объектам, которые он возвращает. Могу ли я использовать #{}
?
Я знаю, что есть .first
.last
методы и, но есть ли такие вещи, как .second
, .third
, .fourth
, и т.д.?
Ответ №1:
У вас есть пример find_in_batches
в документации:
Person.find_in_batches(:conditions => "age > 21", :batch_size => 5) do |group|
sleep(50) # Make sure it doesn't get too crowded in there!
group.each { |person| person.party_all_night! }
end
Однако это может быть не то решение, которое вы ищете. Если у вас 5000 записей, это приведет к выдаче 1000 запросов к базе данных.
Лучшим решением было бы использовать each_slice
, этот метод будет извлекать все записи в одном запросе к базе данных и впоследствии разделять результирующий набор:
Person.find(:all, :conditions => "age > 21").each_slice(5) do |group|
group.each { |person| person.party_all_night! }
end
Комментарии:
1. Вы также можете использовать
Array#in_groups_of
метод, добавленный Rails Core Extensions.2. Добавляет ли это что-то еще
each_slice
, кроме опции заполнения?3. Спасибо, Бенуа и Свананд за помощь. Бенуа, я действительно ценю ваш ответ и то, как вы его объяснили. Отличный ответ. В итоге я использовал in_groups_of, потому что я мог использовать его в представлении, не жертвуя функциональностью will_paginate .
4. @BenoitGarret из ApiDocs ,
in_groups_of
используетeach_slice
в дополнение к возможности заполнения пустых элементов в последней группе значениями по умолчанию.