2017-02-28 3 views
0

Laufen Sie in ein Problem, das ich bisher nicht gefunden habe, und kann nicht scheinen, eine Lösung online überall zu finden, was frustrierend ist. Grundsätzlich habe ich eine Benutzer-Tabelle, die eine invited_by_id Spalte enthält, die die gleiche Benutzer-Tabelle referenziert.Schienen - Bestellung von selbstreferenziellen umfasst

ich jetzt versuchen, eine Abfrage zu erstellen, in dem er die Ergebnisse sortiert auf dem einladenden Benutzer Namen basieren, aber die übliche aktive Datensatz mit Hilfe von hier Sortierung wirklich

User 
.includes(:invited_by) 
.order("users.name ASC") 

Da sowohl der Tabellen nicht funktioniere in Frage sind die gleichen, es scheint, Schienen wählt die erste, und nicht die laded_by-Assoziation.

Gibt es eine Möglichkeit zu spezifizieren, dass ich auf der Assoziation bestellen möchte?

Weitere Informationen

Ich versuche, dies in einem aktiven Datensatz mixin zu verwenden, so dass ich nicht diese direkt auf der Basisklasse anrufen, und es muss mit einem bestehenden Umfang als Misch arbeitet Methode wird für den Bereich aufgerufen. Zum Beispiel

User 
.includes(:invited_by) 
.where(where_clause) 
.sort(:invited_by_name, :asc) 

Hier werden die sort Methode wird von der mixin vorgesehen ist, und das ist, wo es zwischen den Tabellen unterscheiden können muss. Ich habe Logik, die bedeutet, dass es weiß, was die Beziehung ist, so dass es weiß, dass :invited_by_name ist die Spalte Name, der: eingeladenen_Beziehung, aber das ist so weit wie ich habe.

Antwort

0

Sie müssen auf die gleiche Tabelle wie verschiedene Namen verweisen. Sie können dies mit Arel tun

guest = Arel::Table.new(:users, :as => 'guest') 
inviter = Arel::Table.new(:users, :as => 'inviter') 

relation = guest. 
    project(Arel.sql('*')). 
    join(inviter).on(guest[:invited_by_id].eq(inviter[:id])). 
    order(inviter[:name]) 

@users = relation.to_sql 
+0

Würde dies mit einem vorhandenen Bereich funktionieren? Der Ort, wo dies sein wird, ist innerhalb eines Mixins, der verkettet ist, also mit einem existierenden Bereich arbeiten muss und nicht nur mit dem Benutzermodell. – PaReeOhNos

+0

Huh, nein, ich kann es nicht funktionieren sehen oder mir vorstellen, wie ich es ausprobieren soll. Ich habe Arel nur mit Scopes gegoogelt und habe nichts brauchbares gesehen. Es gibt diesen Blogeintrag über geänderte Arel-Knoten, aber ich bin mir nicht sicher, wie hilfreich das für Sie wäre ... https://www.viget.com/articles/composable-sql-queries-in-rails-using-arel – SteveTurczyn

+0

hmm nein, das ist mein Problem :(wird weiter graben – PaReeOhNos