2017-09-20 1 views
0

Dites un user a beaucoup trees et trees ont beaucoup apples. Supposons qu'une méthode prenne l'identifiant d'un utilisateur. Je veux éventuellement les données à ressembler à quelque chose comme ceci:Comment saisir tous les enregistrements imbriqués de la manière la plus efficace. Rails

[ 
    { tree_id1: [apple1, apple2, apple3] }, 
    { tree_id2: [apple4, apple5, apple6] }, 
    { tree_id3: [apple9, apple8, apple7] } 
] 

donc je vais finalement avoir à parcourir les arbres de l'utilisateur et associer les pommes avec elle. Mais je ne veux pas avoir à frapper la base de données pour récupérer les pommes de l'arbre à chaque fois. Cela semble être un N + 1 (obtenir les arbres de l'utilisateur, puis toutes les pommes de l'arbre).

Que puis-je faire pour récupérer efficacement les enregistrements nécessaires afin de pouvoir organiser les enregistrements dans le format de données dont j'ai besoin?

Lorsque vous effectuez des requêtes N + 1 ... pourquoi est-ce si grave? Où est la base de données par rapport au code de l'application lorsque vous dites que vous êtes sur heroku? Est-ce un appel réseau?

Répondre

0

Vous pouvez surmonter le N + 1 en appliquant eager loading

vous pouvez le faire en utilisant includes comme le coup:

User.includes(trees: :apples)

+0

Donc une fois que je faites cela, que se passe-t-il exactement? Tous les enregistrements sont en mémoire, donc si j'appelle 'tree.apples' il ne frappe pas la base de données? Est-ce une fonctionnalité de rails ou une fonctionnalité sql? – Jwan622

1

Vous pouvez utiliser le chargement désireux

users = User.includes(trees: :apples) 

Au lieu de tirer N + 1 requêtes, il lancera seulement trois requêtes

1) Select * from users 
2) Select * from trees where user_id IN [ids_of_users_fetch_from_above_query] 
2) Select * from apples where apple_id IN [ids_of_trees_fetch_from_above_query] 

Alors maintenant, quand vous écrivez

users.first.apples 

Aucune requête est tiré que les enregistrements sont déjà impatients chargés lorsque vous les utilisateurs récupérés

Et Il est la caractéristique des Rails