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 }
..
Haben Sie meine Lösung unten versucht? Ist es in der Nähe von dem, was Sie für SiD Devesh gesucht haben? –
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 –
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. –