2016-04-05 8 views
-1

Ich habe eine Rails-App mit Benutzermodell und ein Kursmodell.
Benutzer has_many Kurse und Kurse has_many Studenten (Benutzer).
Wie sortiere ich die Benutzer nach der Gesamtzahl der Schüler, die sie unter allen Kursen haben.
Ich versuchte so etwas wie
Sortieren Benutzer nach nos von Studenten ihrer Kurse selbstreferenziell

User.joins(:courses).group('users.id').order("COUNT(course.users) DESC")
aber es funktioniert nicht.Wie erreiche ich das?
Course.rb

class Course < ActiveRecord::Base 
     searchkick 
     belongs_to :user 
     belongs_to :category 
     has_many :coursejoins, dependent: :destroy, foreign_key: "learnable_id" 
     has_many :students, through: :coursejoins, class_name: "User" 
     has_many :documents, dependent: :destroy 
     has_many :comments, dependent: :destroy 
     .. 

User.rb

class User < ActiveRecord::Base 
     searchkick 
     has_many :courses, dependent: :destroy 
     has_many :coursejoins, dependent: :destroy, foreign_key: "student_id" 
     has_many :learnables, through: :coursejoins, class_name: "Course" 
     has_many :comments, dependent: :destroy 
     before_save { self.email = email.downcase } 
     validates :name, presence: true, length: { minimum: 5, maximum: 40 } 
     .. 
+0

Haben Sie meine Lösung unten versucht? Ist es in der Nähe von dem, was Sie für SiD Devesh gesucht haben? –

+0

Entschuldigung für die späte Antwort, ich habe in 'counter_cache' nachgeschaut ... mein Benutzermodell ist tatsächlich etwas anders, also war ich mir nicht sicher, ob das funktionieren wird ... Ich werde meine Frage mit meinen Benutzer- und Kursmodellen aktualisieren ... kannst du Sag mir, ob es noch funktioniert ... @RodrigoMartinez –

+0

Der counter_cache speichert counter (*) einer bestimmten Assoziation für ein Datenbankattribut. Die Idee hinter dem, was ich dir gesagt habe, ist, ein Datenbankattribut in der Kurstabelle zu haben, damit du es bestellen kannst durch sie (oder in diesem Fall durch eine auf sie angewandte Funktion). Nachdem Sie gesagt haben, dass Sie den Zähler auf eine bestimmte Assoziation setzen müssen, sieht es in diesem Fall so aus: has_many: students, through:: coursejoins, class_name: "User", counter_cache: true und add 'students_count' to' Kurstabelle anstelle von dem, was ich auf meine ursprüngliche Antwort geschrieben habe - und stattdessen in der Abfrage 'sum (courses.students_count)' 'verwenden. –

Antwort

0

Etwas übermäßig komplex, aber das ist etwas, was Sie tun können: auf den folgenden Cache Anzahl der Benutzer

in Ihrem Kursmodell jeder Kurs:

has_many :users, through: :students, counter_cache: true 

Sie dann nee d, um die Spalte users_count zu courses Tabelle hinzuzufügen, und Sie müssen wahrscheinlich die Zähler zu initialisieren, so nach reset_counters Methode suchen.

Danach denke ich, diese Abfrage funktionieren sollte:

User.joins(:courses).select("users.id, sum(courses.users_count)").group('users.id').order("sum(courses.users_count)") 
+0

es funktionierte, aber counter_cache musste zu coursejoin model hinzugefügt werden als 'gehört_zu: lernbar,: klassen_name =>" Kurs ",: counter_cache =>: students_count' ... dann funktioniert die Abfrage –

+0

auch select musste aus der Abfrage entfernt werden .. .'User.joins (: Kurse) .group ('users.id'). Order ("sum (courses.students_count)") ' –

+0

Super! Froh, dass es geholfen hat! –

Verwandte Themen