1. ホーム
  2. sql

[解決済み] Rails 4のLEFT OUTER JOIN

2023-04-27 12:33:49

質問

3つのモデルを持っています。

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

Courses テーブルにある、特定の学生に関連する StudentEnrollments テーブルに存在しないコースのリストを照会したいと思います。

私はおそらく左結合が行くべき方法であることを発見しましたが、railsのjoins()は引数としてテーブルしか受け入れないようです。 私が望むことを行うだろうと思うSQLクエリは次のとおりです。

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

このクエリをRails 4の方法で実行するにはどうしたらよいでしょうか?

どんな意見でも結構です。

どのように解決するのですか?

結合SQLを文字列で指定することもできます。 joins("LEFT JOIN StudentEnrollment se ON c.id = se.course_id")

しかし、私はわかりやすくするために、レール標準のテーブル名を使っています。

joins("LEFT JOIN student_enrollments ON courses.id = student_enrollments.course_id")