Vous pouvez utiliser une hâte rejoindre:
@customers = Customers.paginate :page => 1, :per_page => 20, :include => [:orders]
En spécifiant le: paramètre include à la jointure, les commandes seront pré-chargés, ce qui empêche le problème n + 1. Vous pouvez ensuite utiliser customer.orders.length.
Si le chargement de toutes ces commandes nécessite trop de mémoire, explorez counter_cache
. Il est conçu pour tenir un compte d'un modèle sur un modèle associé:
class Order
belongs_to :customer, :counter_cache => true
end
Cela augmenter et diminuer un champ orders_count
sur la possession customer
enregistrement lorsque les commandes sont ajoutés ou retirés de la associaition.
Si vous ne voulez pas utiliser counter_cache, vous avez besoin d'un outil de recherche personnalisé qui joint la table orders et les groupes sur orders.customer_id, puis sélectionne le compte comme champ supplémentaire. Cela ne fonctionnera pas aussi bien que le cache du compteur, cependant.