Rails: перебирает все объекты типа, не загружая их все сразу - PullRequest
21 голосов
/ 27 апреля 2011
class Car << ActiveRecord::Base
end

Car.all.each do |car|
  # do stuff
end

Это загружает все объекты типа Car в память (я думаю) и перебирает их.Вместо этого я хочу перебирать все идентификаторы и загружать их по одному:

Car.all_ids.each do |id|
  c = Car.find id
  # do stuff
end

Но all_ids не существует, есть ли эквивалент?

Ответы [ 4 ]

55 голосов
/ 08 марта 2012

Для Rails 2.3 и выше (включая Rails 3) самое простое решение - find_each:

Car.find_each do |car|
  # do stuff
end

Это автоматически выполняет запрос в пакетном режиме.Размер партии по умолчанию - 1000, но вы можете установить свой собственный.Он также работает вместе с именованными областями и ActiveRecord :: Relations:

Car.hotrods.where(:color => 'red').find_each(:batch_size => 10) { do |car| ... }

См. http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches

13 голосов
/ 27 апреля 2011

Вы можете использовать find_in_batches , который выбирает записи x одновременно, где x настраивается и по умолчанию 1000.

  Person.where("age > 21").find_in_batches do |group|
    # group is an array of 1000 records
    group.each { |person| person.party_all_night! }
  end
6 голосов
/ 27 апреля 2011

Вы можете сделать следующее:


Car.find(:all, :select => :id).each do |car_id|
  c = Car.find(car_id.id)
end

для Rails 2.3, еще не знаком с 3

Редактировать :

Одно из возможных решений, которое будет более эффективным (меньше запросов):


Car.find(:all, :select => :id).map(&:id).each_slice(5) do |ids|
  cars_slice = Car.find(ids)
end
3 голосов
/ 27 октября 2014

В Rails 4+ pluck очень полезен.

Car.pluck(:id).each do |id|
  c = Car.find id
  # do stuff
end

Car.pluck(:id) возвращает массив записей.Вы можете выбрать любой другой столбец вашей модели, изменив параметр.Кроме того, вы можете выбрать комбинацию столбцов.Например:

Car.pluck(:id, :make, :model).each do |id, make, model|
  c = Car.find id
  # access make and model as well
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...