問題
User has_many Cup(s)といった関連のなかで、
Cup.destroyをしたところUserまでも消えてしまった。
理由については本記事を見てもらえればわかるが、
dependent: :destroyの付与について時折迷うことがあったので
備忘録として残しておく。
対処
以下のような関連があるとする。
User
User has_many Cup(s)
Cup
Cup belongs_to User
この関連に対し、dependent: :destroyを以下のように設定していた。
Class User < ApplicationRecord
has_many :cups, dependent: :destroy
end
class Cup < ApplicationRecord
belongs_to :user, dependent: :destroy
end
この状態でCup(のインスタンス)をdestroyしたところ、
そのユーザまでもが削除されてしまった。
そこで下記のようにbelongs_toからdependent: :destroyを
消去したところ、Cupを消してもそのユーザは残ったままになった。
Class User < ApplicationRecord
has_many :cups, dependent: :destroy
end
class Cup < ApplicationRecord
belongs_to :user
end
:dependentの付与の仕方
has_many、belongs_toどちらにdependent: :destroyをつけるか迷う時があるが、上記より、
dependent: :destroyを指定したクラスが消えた場合に、
dependent: :destroyを設定したモデル(のインスタンス)がdestroyされる
ということになる。
具体例
class Cup < ApplicationRecord
belongs_to :user, dependent: :destroy
end
このコードでは、
dependent: :destroyを指定したクラス:Cup
dependent: :destroyを設定したモデル(のインスタンス):user
となるので、Cupが消えるとUserが消えることになる。
Class User < ApplicationRecord
has_many :cups, dependent: :destroy
end
このコードでは、
dependent: :destroyを指定したクラス:User
dependent: :destroyを設定したモデル(のインスタンス):cups
となるので、Userが消えるとCup(s)が消えることになる。
おわり