Posted at

has_many :through時のdependent: :destroyの挙動

RailsのActive Recordで多対多の関連を使う時の話。ここではClubとStudentの関係を例とする。

普通に書くと、こうなると思う。

class Club < ApplicationRecord

has_many :club_students, dependent: :destroy
has_many :students, through: :club_students
end

class Student < ApplicationRecord
has_many :club_students, dependent: :destroy
has_many :clubs, through: :club_students
end

ただ、このようにも書ける。

class Club < ApplicationRecord

has_many :club_students
has_many :students, through: :club_students, dependent: :destroy
end

class Student < ApplicationRecord
has_many :club_students
has_many :clubs, through: :club_students, dependent: :destroy
end

この書き方だとClubを削除した時に関連するStudentも削除されるのではないか?と思われそうだが、throughを使った場合は中間レコードのみ削除されるので、結果的に前者と同様の挙動となる。

どちらで書くかは好みの問題だろうが、個人的には後者の方が多対多の関連を1行で明示できるので、最近はこちらを使うことが多い。ただ、毎度心配になるのと、ググっても情報が出てこないため、備忘録として残しておく。