2017-07-25 1 views
0

J'ai un modèle Booking qui contient space_id attributs associés à Space Modèle par belongs_to :space.Meilleur moyen d'obtenir des enregistrements d'un autre modèle encore et encore - Rails

Maintenant, j'ai plusieurs espaces et je veux compter chaque réservation par rapport à chaque ID.

Je veux obtenir le meilleur moyen de récupérer les enregistrements de DB sans requête de feu encore et encore. Actuellement, je fais comme ceci:

spaces = Space.all 
result = [] 
spaces.each do |s| 
    result << s.as_json.merge(:bookings_counts=>s.bookings.count) 
end 

mais cette requête est mise à feu forment encore et encore db. Y a-t-il un meilleur moyen de le faire?

Répondre

1

Cela s'appelle un "N + 1 requêtes" problème. Dans Rails, vous pouvez utiliser le chargement rapide pour le résoudre. Vous pouvez utiliser includes pour charger des enregistrements dans une seule requête en changeant la première ligne de votre code à

spaces = Space.eager_load(:bookings) 

Voici une bonne explication et la comparaison des moyens (includes, eager_load et preload) pour faire le chargement désireux de Rails link .