Dans Rails, find_each et where sont utilisés pour récupérer les données de la base de données prise en charge par ActiveRecord.
Vous pouvez transmettre votre condition de requête à where
, comme:
c = Category.where(:name => 'Ruby', :position => 1)
Et vous pouvez transmettre la taille du lot à find_each
, comme:
Hedgehog.find_each(batch_size: 50).map{ |p| p.to_json }
Mais quelle est la différence entre le code 2 suivant?
# 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
Le lot du code 1 récupère-t-il 50 tuples à chaque fois et le code 2 récupère-t-il tous les tuples en une seule fois? Des explications plus détaillées sont les bienvenues.
Mon avis est:
where
et find_each
peut être utilisé pour la récupération par lots, mais l'utilisateur peut définir la taille des lots lors de l'utilisation de find_each
.find_each
ne prend pas en charge la transmission de la condition de requête.Veuillez me corriger si ma compréhension est fausse.
Une relation d'enregistrement active ne charge pas automatiquement tous les enregistrements en mémoire.
Quand vous appelez #each
, tous les enregistrements seront chargés en mémoire. Quand vous appelez #find_each
, les enregistrements seront chargés en mémoire par lots de la taille de lot donnée.
Ainsi, lorsque votre requête renvoie un certain nombre d'enregistrements qui constitueraient trop de mémoire pour les ressources disponibles du serveur, utiliser alors #find_each
serait un excellent choix.
C'est comme utiliser l'énumération paresseuse de Ruby #to_enum#lazy
avec #each_slice
et alors #each
(très pratique).