Wir sind schon links und verbinden uns mit einer Tabelle, so dass wir nach einer Spalte sortieren können, wenn die Beziehung existiert:
%Vor% Dies führt zu einer einzelnen SQL-Abfrage, aber ich möchte, dass people.first.address
SQL nicht auslöst, um die Adresse zu laden. Ich bin Links-Beitritt, weil einige Leute keine Adressen haben.
.includes(:address)
löst eine separate Abfrage aus.
Sie können das tun, was ich mit inneren Joins vorschlage, indem Sie includes
verwenden, aber das löst 2 SQL-Abfragen aus:
Während joins
+ includes
nur einen auslöst (aber INNER Joins):
Der aktive Datensatz verwendet auch linke Joins, wenn Sie beim Ladevorgang eine Verknüpfung erzwingen
.eager_load(:addresses)
.
Können Sie eine bestehende Linksverbindung nehmen und Schienen mit diesen Ergebnissen eifrig laden? Bis jetzt kann ich das nicht finden.
Versuchen Sie Folgendes:
%Vor% eager_load
erzwingt eifriges Laden durch Ausführen eines LINKEN OUTER-JOINS.
Ich habe eine Zusammenfassung für das Land hinzugefügt, damit Sie mehr Kontrolle darüber haben, wo Personen ohne Adressen in den Ergebnissen erscheinen.
So sieht es für mich aus:
%Vor%Beachten Sie, dass keine Abfragen ausgeführt werden, wenn Sie auf die Adressen
zugreifenIch weise darauf hin, dass Sie nach einer Tabelle sortiert haben, die äußerlich verbunden ist, also müssen Sie entscheiden, wie Sie Nullen behandeln wollen.
Nun, in Ihrem Fall könnten Sie Ihre Abfrage auswählen, indem Sie einen Alias für die Felder erstellen, die Sie verwenden möchten, z. B. wie folgt:
%Vor%Dies wird Ihre gewünschte Abfrage nicht ändern und führt nicht zu zusätzlichen Abfragen, nicht nur für das Land.
Sie können #references
mit #includes
bis LEFT JOIN
deine Beziehung und erreiche, wonach du suchst.
Dies ergibt eine Abfrage und alle Personen, egal ob sie eine Adresse haben oder nicht, und auch eifrig laden die Adressen, um die gefürchteten N + 1 Abfragen zu vermeiden.
Die Dokumentation erklärt nicht sehr gut, dass #references
ein LEFT JOIN
hinzufügt, aber es ist möglich, das Hinzufügen von SQL-Klauseln ( WHERE
, ORDER
, GROUP
usw.) zu erlauben die Beziehung in Verbindung mit #includes
.
Tags und Links ruby-on-rails activerecord ruby-on-rails-4 rails-activerecord