: Einschließen und Tabellen-Aliasing

9

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?

    
dondo 02.06.2010, 21:42
quelle

3 Antworten

3

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%     
Taryn East 16.08.2010 18:43
quelle
0

etwas wie

%Vor%     
zed_0xff 02.06.2010 21:57
quelle
0

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:

%Vor%

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.

    
Voyta 02.06.2010 22:00
quelle

Tags und Links