ho 3 modelli: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
desidero query per un elenco di corsi nella tabella I corsi, che non esiste nella tabella StudentEnrollments che sono associati con un certo studente .
Ho scoperto che forse Left Join è la strada da percorrere, ma sembra che joins() in rails accetti solo una tabella come argomento. La query SQL che penso avrebbe fatto quello che voglio è:
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
Come faccio a eseguire questa query il Rails 4 vie?
Qualsiasi input è apprezzato.
La mia soluzione ha finito per essere: query = "LEFT JOIN student_enrollments ON courses.id = student_enrollments.course_id e" + "student_enrollments.student_id = # {self.id}" courses = Course.active.joins (query) .where (student_enrollments: {id: nil}) Non è come Rails come voglio, anche se ha fatto il lavoro. Ho provato a usare .includes(), che fa il LEFT JOIN, ma non mi permette di specificare una condizione aggiuntiva al momento dell'iscrizione. Grazie Taryn! – Khanetor
Grande. Ehi, a volte facciamo quello che facciamo per farlo funzionare. È ora di tornare a farlo e renderlo migliore in futuro ... :) –