Разбор или повторение нескольких записей одновременно в rails 2.3.8

#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 в дополнение к возможности заполнения пустых элементов в последней группе значениями по умолчанию.