35歳からの中二病エンジニア

社寺・鉄道・アニメを愛でるウェブ技術者の呟き

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行で明示できるので、最近はこちらを使うことが多い。ただ、毎度心配になるのと、ググっても情報が出てこないため、備忘録として残しておく。