rails de sélectionner et de les inclure
Quelqu'un peut-il m'expliquer cela?
Project.includes([:user, :company])
Cela exécute 3 requêtes, l'un pour aller chercher de projets, l'un pour aller chercher les utilisateurs de ces projets et un pour aller chercher entreprises.
Project.select("name").includes([:user, :company])
Cela exécute 3 requêtes, et ignore complètement les sélectionner bits.
Project.select("user.name").includes([:user, :company])
Cela exécute 1 de la requête avec une bonne gauche rejoint. Et encore ignore complètement le sélectionner.
Il me semble que les rails ignore sélectionnez avec la comprend. Ok très bien, mais pourquoi quand je mets un modèle associé à sélectionner t-il passer de la délivrance de 3 requêtes de l'émission de la requête 1?
Noter que le 1 de la requête est ce que je veux, je ne peux pas imaginer que c'est la bonne façon de l'obtenir, ni pourquoi cela fonctionne, mais je ne suis pas sûr de quelle autre manière à obtenir les résultats dans une seule requête (.les jointures semble être la seule à utiliser une JOINTURE INTERNE qui je n'en fait pas envie, et quand j'ai manuellement specifcy les conditions de jointure .les jointures de la recherche gem, nous utilisons les freaks comme il essaie de l'ajouter à nouveau joint avec le même nom).
OriginalL'auteur Chad | 2010-11-12
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème avec les sélectionner et les comprend.
Pour impatient de chargement de modèles associés j'ai utilisé natif Rails champ d'application "de la précharge' http://apidock.com/rails/ActiveRecord/QueryMethods/preload
Il fournit désireux de charge sans sauter de "sélectionner" à des étendues de la chaîne.
Je l'ai trouvé ici https://github.com/rails/rails/pull/2303#issuecomment-3889821
Espère que cette astuce vous sera utile pour quelqu'un comme cela a été utile pour moi.
:preload
FTWOriginalL'auteur
Bon alors, voici ce que j'ai trouvé...
Œuvres, des douleurs dans les fesses, mais ça me prend juste les données dont j'ai besoin dans une seule requête. La seule moche partie est que j'ai tout donner un model2 alias puisque nous l'utilisons meta_search, qui semble ne pas être en mesure de comprendre qu'une table est déjà rejoint lorsque vous spécifiez vos propres conditions de jointure.
OriginalL'auteur
Rails a toujours ignoré les
select
argument(s) lors de l'utilisation deinclude
ouincludes
. Si vous souhaitez utiliser votre sélectionnez argument puis utilisezjoins
à la place.Vous pourriez avoir un problème avec la requête bijou dont vous parlez, mais vous pouvez également inclure sql fragments en utilisant les jointures de la méthode.
Je ne sais pas votre schéma de sorte que j'aurais du deviner exactement les relations, mais ce devrait vous obtenir a commencé.
Recherche gem utilisez-vous?
meta_search, voir ci-dessous pour la solution j'ai pour l'instant...
OriginalL'auteur
Je suis peut-être totalement manque quelque chose ici, mais
select
etinclude
ne sont pas une partie de ActiveRecord. La façon habituelle de faire ce que vous essayez de faire, c'est comme cela:Prendre un coup d'oeil à la la documentation de l'api pour plus d'exemples. De temps en temps j'ai dû aller le manuel et l'utilisation
find_by_sql
:J'espère que cela va vous diriger dans la bonne direction.
J'ai pensé que cela pourrait avoir été le cas (je n'ai pas encore à plonger dans la v3), bien que je ne pouvais pas trouver une référence dans l'API docs. La syntaxe semble un peu contre-intuitif de ce que je peux voir.
OriginalL'auteur
Je voulais que la fonctionnalité de moi-même,donc merci de l'utiliser.
Inclure cette méthode dans votre classe
#ACCEPTE les arguments dans un format de chaîne "ASSOCIATION_NAME:COLUMN_NAME-COLUMN_NAME"
Et vous serez en mesure de les appeler comme: Contrat.includes_with_select('utilisateur:id-nom-statut", "confirmation:confirmé-id'), et la sélection de celles des colonnes spécifiées.
OriginalL'auteur