Railsのdependentオプション
モデルで関連づけの記述をするときに使うdependent
オプション。
中でもよく使うのはdestroy
だと思う。
destroy
もあるがdelete
もあるのでその違いをば。
・deleteとdestroyのちがいは?
とりあえず公式↓
dependentについて:Rails ガイド
delete・・・最小限。SQLを直接打ってるようなもの、指定のデータ1つのみを削除
destroy・・・Activerecordを介して削除する、関連付けられたモデルも削除
dependentオプションの種類:
:destroy
、:delete
、:destroy_async
、:nullify
:destroy
関連したやつ全部消える 無理心中。まじメンヘラ:delete
(has_manyだと:delete_all?) SQL操作のみてきな挙動。関連したやつ消えない。指定したやつのみが消える。みなしご。親の名前はのこる。:destroy_async
非同期で削除する →{何か色々手順あるっぽいけど、めちゃくちゃ削除処理が重い時はこれ使うのを検討すれば良いとかじゃないかな(先輩談)}- :nullify 指定されたモデルは消え、関連しているモデルの外部キーにNULLがはいる(NOTNULL制約ついてるとROLLBACKする)。みなしご。親の記憶は抹消される。
参考:
https://dorarep.page/articles/rails-dependent https://railsguides.jp/association_basics.html#has-one%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3-dependent
https://qiita.com/takayuu276/items/b86ac6b620d2b15c0164
ex.
親モデルparent has_many :children
子モデルchild belongs_to :parent
親オブジェクト(id: 1, name:父さん) 子オブジェクト(id: 1, name:息子, parent_id: 1) があったとする☆親モデル
parent has_many :children, dependent: :delete_all
にしたとき、
親モデルdestroyすると子オブジェクトにはなんら影響しない
(id: 1, name:息子, parent_id: 1 のまま)
※nullifyは↑でいうと子オブジェクトのparent_id: NULLになるイメージだが、NOTNULL制約が付いているとdestroyしようとするとNotNullViolationでROLLBACKする。そんなときは子モデルの方でbelongs_to :parent, optional: true
とすることで外部キーにnullが入ることが許容されるようになる
https://qiita.com/takuyanin/items/6f6be86d1265be21bf9e
dependentオプションどれを使うかははケースバイケース(先輩談)