В 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
не поддерживает условие прохождения запроса.
Пожалуйста, поправьте меня, если мое понимание неверно.
Ответы
Ответ 1
Активное отношение записи не автоматически загружает все записи в память.
Когда вы вызываете #each
, все записи будут загружены в память. Когда вы вызываете #find_each
, записи будут загружаться в память партиями заданного размера партии.
Итак, когда ваш запрос возвращает количество записей, которые будут слишком большой для доступных ресурсов сервера, использование #find_each
было бы отличным выбором.
В основном это похоже на использование рубинового lazy перечисления #to_enum#lazy
с #each_slice
, а затем #each
(очень удобно).