2009-12-31 7 views
4

Je me demande s'il existe un moyen de prendre un tableau de résultats ActiveRecord (ou n'importe quel tableau, d'ailleurs) et de le traiter par groupes de 25 ou plus. Quelque chose comme ceci:Comment traiter un grand ensemble de résultats ActiveRecord dans les groupes

User.all.each(25) do |group| 
    # Some code that works with this group of 25 
end 

Je cherche juste à éviter de faire plusieurs requêtes de base de données successives. Merci!

Répondre

21

Rails 2.3 ont cette fonction. Vous pouvez spécifier le paramètre batch_size.

User.find_in_batches(:batch_size =>25) do |group| 
    # Some code that works with this group of 25 
end 

Vous pouvez trouver un bon tutoriel here. Notez que Rails émettra une requête pour tous les 25 enregistrements. Ceci est utile pour garder la mémoire faible si vous traitez un grand nombre d'enregistrements. Si vous souhaitez diviser les résultats en plusieurs tableaux, vous pouvez utiliser in_groups_of comme suggéré par Matt.

+0

Je vous avais d'abord choisi votre réponse, mais j'ai fini par aller avec Matt Rogish parce qu'il évite de faire plusieurs requêtes. – bloudermilk

+1

Je vous invite à reconsidérer Bloudermilk. Si vous avez beaucoup d'enregistrements, il faudra non seulement beaucoup de temps pour les récupérer, mais aussi beaucoup de mémoire, ce qui pourrait rendre votre serveur inactif. Les traiter en petites séries est beaucoup, beaucoup, BEAUCOUP mieux que de les chercher tous à la fois. –

-2
+5

Ceci ira chercher la totalité de la collection et la stockera en mémoire. Mauvaise idée. –

+1

Dépend du nombre de lignes et de la taille. Il y a un compromis entre l'efficacité de la requête/réseau et l'utilisation de la mémoire du processus ruby. Seul l'auteur de la question initiale a les connaissances nécessaires pour dire ce qui s'applique à son problème. –

+3

Ryan a raison. 'AR :: Base # find_each' ou' AR :: Base # find_in_batches' est la solution. –

Questions connexes