Rails: itération sur tous les objets d'un type sans les charger de tous à la fois
class Car << ActiveRecord::Base
end
Car.all.each do |car|
# do stuff
end
Cette charge tous les objets de type Voiture en mémoire (je pense) et parcourt eux. Ce que je veux au lieu de cela consiste à parcourir tous les id et les charger un à un moment comme celui-ci:
Car.all_ids.each do |id|
c = Car.find id
# do stuff
end
Mais all_ids n'existe pas, est-il équivalent?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez effectuer les opérations suivantes:
pour les Rails 2.3, pas familier avec 3 encore
Modifier:
Une solution possible pour être plus efficace (moins de requêtes):
n
requêtes.Pour les Rails 2.3 et plus (y compris les Rails 3) la solution la plus simple est find_each:
Cela exécute la requête en lots pour vous automatiquement. La taille de lot par défaut est de 1000, mais vous pouvez définir votre propre. Il travaille également aux côtés nommé étendues et ActiveRecord::Relations:
Voir http://guides.rubyonrails.org/active_record_querying.html#retrieving-multiple-objects-in-batches
Vous pouvez utiliser find_in_batches, qui extrait les enregistrements
x
à un moment, oùx
est configurable et par défaut 1000.Dans les Rails 4+ je trouve arracher très utile.
Car.pluck(:id)
retourne un tableau d'entrées. Vous pouvez arracher une autre colonne de votre modèle en modifiant le paramètre. En outre, vous pouvez arracher une combinaison de colonnes. Par exemple:pluck
existe dans Rails 3 trop