web-dev-qa-db-fra.com

Dans Rails, quelle est la différence entre find_each et où?

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:

  1. 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.
  2. find_each ne prend pas en charge la transmission de la condition de requête.

Veuillez me corriger si ma compréhension est fausse.

48
coderz

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).

71
jphager2