Ich leide an einer Variante von dem hier beschriebenen Problem :
ActiveRecord weist Tabellenaliase für Assoziation tritt fair bei unvorhersehbar. Die erste Assoziation zu einer gegebenen Tabelle hält die Tabelle Name. Weitere Verbindungen mit Verbänden Zu dieser Tabelle verwende Aliase einschließlich die Assoziationsnamen im Pfad ... aber es ist üblich für App-Entwickler über [andere] nicht zu wissen Kodierungszeit.
In meinem Fall werde ich von einer giftigen Mischung aus has_many und: include gebissen. Viele Tabellen in meinem Schema haben eine Spalte state
und die has_many möchte Bedingungen für diese Spalte angeben: has_many :foo, :conditions => {:state => 1}
. Da die Statusspalte jedoch in vielen Tabellen angezeigt wird, unterscheide ich mich durch explizite Angabe des Tabellennamens: has_many :foo, :conditions => "this_table.state = 1"
.
Das hat bis jetzt gut funktioniert, wenn ich für die Effizienz ein :include
hinzufügen möchte, um einen ziemlich tiefen Datenbaum vorzuladen. Dies führt dazu, dass die Tabelle in verschiedenen Codepfaden ungleichmäßig aliasiert wird. Mein Lesen der oben genannten Tickets ist, dass dieses Problem nicht und wird nicht in Rails 2.x behoben werden. Ich sehe jedoch keine Möglichkeit, die vorgeschlagene Problemumgehung anzuwenden (um den Alias-Tabellennamen explizit in der Abfrage anzugeben). Ich bin froh, den Tabellenalias ausdrücklich in der has_many-Anweisung anzugeben, aber ich sehe keinen Weg dazu. Daher scheint die Problemumgehung in dieser Situation nicht anwendbar zu sein (und ich nehme an, in vielen Szenarios mit "named_scope").
Gibt es einen brauchbaren Workaround?
Anstatt: include zu verwenden, können Sie mit dem Joins-Schlüssel explizit den Join schreiben und ihm einen eigenen Tabellenalias geben. Sie müssen den Join manuell angeben, aber Ihre Anforderungen werden dadurch eindeutig. zB:
%Vor% Verwenden Sie eines der Felder aus den Tabellen :include
in der Abfrage (wie: Bedingungen /: Reihenfolge usw.)? Wenn dies nicht der Fall ist und Sie nur Datensätze laden müssen, können Sie dies mit einer separaten Abfrage tun:
preload_associations
ist eine geschützte Methode (siehe mehr in diesem Abschnitt Antwort), aber mit: Joins und: include zusammen erzeugt in der Regel große SQL-Abfrage, die weit entfernt von managable ist.
Tags und Links ruby-on-rails