Ich habe 3 Modelle:LEFT OUTER JOIN in Rails 4
class Student < ActiveRecord::Base
has_many :student_enrollments, dependent: :destroy
has_many :courses, through: :student_enrollments
end
class Course < ActiveRecord::Base
has_many :student_enrollments, dependent: :destroy
has_many :students, through: :student_enrollments
end
class StudentEnrollment < ActiveRecord::Base
belongs_to :student
belongs_to :course
end
Ich wünsche ich eine Liste der Kurse in den Kursen Tabelle abzufragen, die in der StudentEnrollments Tabelle nicht existieren, die mit einem bestimmten Schüler verbunden sind, .
Ich fand, dass vielleicht Left Join ist der Weg zu gehen, aber es scheint, dass Joins() in Schienen akzeptieren nur eine Tabelle als Argument. Die SQL-Abfrage, die ich denke, würde das tun, was ich will, ist:
SELECT *
FROM Courses c LEFT JOIN StudentEnrollment se ON c.id = se.course_id
WHERE se.id IS NULL AND se.student_id = <SOME_STUDENT_ID_VALUE> and c.active = true
Wie führe ich diese Abfrage die Rails 4 Weg?
Jede Eingabe wird geschätzt.
Meine Lösung endete als: query = "LEFT JOIN student_enrollments ON courses.id = student_enrollments.course_id UND" + "student_enrollments.student_id = # {self.id}" courses = Course.active.joins (Abfrage) .where (student_enrollments: {id: nil}) Es ist nicht so wie Rails, wie ich es will, obwohl es die Arbeit erledigt. Ich habe versucht, .includes() zu verwenden, was die LINKE VERBINDUNG tut, aber es erlaubt mir nicht, eine zusätzliche Bedingung beim Verbinden anzugeben. Danke Taryn! – Khanetor
Großartig. Hey, manchmal machen wir, was wir tun, damit es funktioniert. Zeit, um zu ihr zurückzukehren und sie in Zukunft besser zu machen ... :) –