ruby on rails - que - En Rails, ¿cuál es la diferencia entre find_each y where?
ruby on rails tutorial (1)
Una relación de registro activa no carga automáticamente todos los registros en la memoria.
Cuando llame a
#each
, todos los registros se cargarán en la memoria.
Cuando llame a
#find_each
, los registros se cargarán en la memoria en lotes del tamaño de lote dado.
Entonces, cuando su consulta devuelve una cantidad de registros que serían demasiada memoria para los recursos disponibles del servidor, entonces usar
#find_each
sería una gran opción.
Básicamente es como usar la enumeración perezosa de ruby
#to_enum#lazy
con
#each_slice
y luego
#each
(muy conveniente).
En Rails, find_each y where se utilizan para recuperar datos de la base de datos compatible con ActiveRecord.
Puede pasar su condición de consulta a
where
, como:
c = Category.where(:name => ''Ruby'', :position => 1)
Y puede pasar el tamaño del lote a
find_each
, como:
Hedgehog.find_each(batch_size: 50).map{ |p| p.to_json }
Pero, ¿cuál es la diferencia entre el siguiente código 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
¿El lote de código 1 recupera 50 tuplas cada vez y el código 2 recupera todas las tuplas de una vez? Más detalles de explicación es bienvenida.
Mi opinión es:
-
where
yfind_each
se pueden usar para la recuperación de lotes, pero el usuario puede definir el tamaño del lote al usarfind_each
. -
find_each
no admite pasar la condición de consulta.
Por favor corríjame si mi comprensión es incorrecta.