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% 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 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?
Es gibt einen tollen Post über manuelle Eager-Last.
Ich denke, das ist, was Sie gesucht haben:
%Vor%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.
Tags und Links ruby ruby-on-rails eager-loading rails-activerecord