deleteとdelete_allとdestroyとdestroy_all
1.レコードに使用するメソッド
Model.first.destroy
そのレコードに対してActiveRecord::Persistence#destroyを実行し、削除する
Model.first.delete
そのレコードに対してActiveRecord::Persistence#deleteを実行し、deleteSQLを直接発行する
2.レコード軍に使用するメソッド
Model.all.destroy_all
モデルのレコード軍1つずつにActiveRecord::Persistence#destroyを実行する
Model.all.delete_all
モデルのレコード軍にActiveRecord::Persistence#deleteを実行し、deleteSQLを直接発行する
3.子レコード軍に使用するメソッド
Model.first.children.destroy_all
Model.first.children.destroy(child)
子レコード全てもしくは1つまたは複数に対してActiveRecord::Persistence#deleteを実行する
ActiveRecord::Persistence#destroyではなくActiveRecord::Persistence#deleteなのに注意!
よって子レコードが削除される際に孫レコードの:dependentは処理されない
Model.first.children.delete_all
Model.first.children.delete(child)
子レコード全てもしくは1つまたは複数に対して:dependentの設定に従った処理を行う
4.has_manyやhas_oneにつける:dependentの値
:dependentとは
親レコードがActiveRecord::Persistence#destroyで削除された時に紐づく子レコードに対して実行されるメソッド
下で紹介する他にもリレーションシップのみを切断(該当カラムをNULLに)する:nullify(デフォルト値?)も指定できる
has_namy :children, dependent: :destroy
親レコードが削除された時に、紐づくレコードを全件検索し、関連の深いところから1件ずつ削除する
:before_destroy、:after_destroyが作用するのでそこで何か処理がある場合はこちら
場合によってはSQLを大量に発行するのでパフォーマンスコストが高い
子レコードが1件づつActiveRecord::Persistence#destroyで削除されるので、孫レコードを持つ場合、孫レコードの:dependentも処理される。
has_namy :children, dependent: :delete_all
has_one :children, dependent: :delete_all
親レコードが削除された時に、紐づく子レコード軍に対してActiveRecord::Persistence#deleteを実行し、deleteSQLを発行する
before_destroy、:after_destroyが作用しない
関連するテーブルの数だけのSQLしか発行されないのでパフォーマンスコストは低い
子レコードはActiveRecord::Persistence#destroyで削除されるわけではないので孫レコードの:dependentは処理されない
上記の影響で外部キー制約違反が起こりがち