Подтвердить что ты не робот

В Rails, какая разница между find_each и где?

В Rails оба find_each и where используются для извлечения данных из базы данных по ActiveRecord.

Вы можете передать условие запроса на where, например:

c = Category.where(:name => 'Ruby', :position => 1)

И вы можете передать размер партии до find_each, например:

Hedgehog.find_each(batch_size: 50).map{ |p| p.to_json }

Но какая разница между следующим кодом 2?

# code 1
Person.where("age > 21").find_each(batch_size: 50) do |person|
  # processing
end

# code 2
Person.where("age > 21").each do |person|
  # processing
end

Выполняет ли пакет 1 1 каждый раз 50 кортежей, а код 2 извлекает все кортежи за один раз? Более подробное объяснение приветствуется.

Мое мнение таково:

  • оба типа where и find_each могут использоваться для пакетного извлечения, но пользователь может определять размер партии при использовании find_each.
  • find_each не поддерживает условие прохождения запроса.

Пожалуйста, поправьте меня, если мое понимание неверно.

4b9b3361

Ответ 1

Активное отношение записи не автоматически загружает все записи в память.

Когда вы вызываете #each, все записи будут загружены в память. Когда вы вызываете #find_each, записи будут загружаться в память партиями заданного размера партии.

Итак, когда ваш запрос возвращает количество записей, которые будут слишком большой для доступных ресурсов сервера, использование #find_each было бы отличным выбором.

В основном это похоже на использование рубинового lazy перечисления #to_enum#lazy с #each_slice, а затем #each (очень удобно).