Rails: eifrig geladen auf einem bereits links verbundenen Tisch?

8

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:

%Vor%

Während joins + includes nur einen auslöst (aber INNER Joins):

%Vor%

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.

    
swajak 25.01.2018, 18:23
quelle

3 Antworten

3

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

zugreifen

Ich 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.

    
John Naegle 01.02.2018 18:42
quelle
2

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.

    
ErvalhouS 01.02.2018 18:32
quelle
1

Sie können #references mit #includes bis LEFT JOIN deine Beziehung und erreiche, wonach du suchst.

%Vor%

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 .

    
DRSE 07.02.2018 16:16
quelle