ActiveRecord eager lädt mehrere assignes_to-Zuordnungen

8

Das Problem

Ich habe das folgende ActiveRecord-Modell:

%Vor%

Wenn ich auf alle drei dieser Zuordnungen zugreifen möchte, generiert es drei Auswahlabfragen:

%Vor%

Dies ist im Wesentlichen das N + 1 Problem .

Im Idealfall möchte ich, dass nur eine Abfrage des Formulars generiert wird

%Vor%

Mögliche Lösung

Ich könnte dies in eine has_many :through => :join_table -Verbindung mit einer Spalte in der Join-Tabelle verschieben, um anzugeben, welcher Assoziationstyp verwendet wird, und dann includes([:join_table, :cars]) verwenden, um die Assoziationen zu laden. In diesem Fall reduziert es jedoch nur 3 Abfragen auf 2 und führt eine zusätzliche Tabelle ein.

Eine andere mögliche Lösung

Eine andere mögliche Lösung wäre, die Assoziationen wie folgt manuell zu laden:

%Vor%

Ich habe es getestet, und es funktioniert.

%Vor%

Allerdings hilft Ihnen das immer noch nicht, wenn Sie Dinge wie

machen wollen %Vor%

Zum Beispiel auf der Personenindexseite. Dies reduziert die Anzahl der Abfragen von 3N + 1 auf 4, aber nur 2 werden tatsächlich benötigt.

Gibt es bessere Lösungen für dieses Problem?

    
Cameron Martin 18.02.2014, 20:37
quelle

3 Antworten

2

Es gibt einen tollen Post über manuelle Eager-Last.

Ссылка

Ich denke, das ist, was Sie gesucht haben:

%Vor%     
Alex Stanovsky 05.09.2014, 21:01
quelle
7

Versuchen Sie Folgendes:

%Vor%

app / models / person.rb

%Vor%

app / models / car.rb

%Vor%

Beweis, dass das funktioniert:

%Vor%

Wichtiger Hinweis: Rails wird automatisch people als Plural von person verwenden. Wenn Sie also ein Person -Modell erstellen, wird eine people -Datenbanktabelle erstellt.

    
franksort 18.02.2014 21:47
quelle
0

Ich würde persönlich eine Join-Tabelle erstellen. Nachdem das gesagt wurde, gibt es eine weitere Option: Es ist möglich, eine Beziehung basierend auf SQL-Abfragen zu definieren:

%Vor%

Dann können Sie Person.includes (: Autos) machen

    
Hesham 19.02.2014 01:16
quelle