削除系メソッド(delete, delete_all, destroy, destroy_all)について

【結論】

・deleteは、指定した条件のレコードに対して
 SQLのDELTE文を直接実行する。
 その為、関連付けられてるレコードは削除されない。

・destroyは、ActiveRecordを介して
 指定した条件のレコードを削除する。
 関連付けられてるレコードも削除される。

・_allは、特定の条件に
 一致するレコードをまとめて削除する

【目次】

【本題】

削除系メソッドについて

RailsActiveRecordには、レコードの削除に対応した
メソッドが4種類存在します。

今回は、各メソッドの仕様と
使い分けについて、解説します。

deleteについて

deleteは、指定した条件に合致する
一件のレコードを削除します。

処理の流れとしては、直接SQLのDELTE文を実行します。

なので、モデルは経由しない為、
関連付けたテーブルのレコードは削除されません。

User.find(id: 1).delete

destroyについて

destroyも、指定した条件に合致する
一件のレコードを削除します。

deleteとの違いを上げるとすると、
モデル(ActiveRecord)を介して削除を行う点です。

その為、関連付けさせたモデルに
dependent: :destroyを指定していれば、
そちらのレコードも一緒に削除してくれます。

User.find(1).destroy

delete_allとdestroy_allについて

これらは、deleteやdestroyと違い、
条件に合致する複数のレコードを同時に削除することが可能です。

Post.where(user_id: 1).delete_all
Post.where(user_id: 1).destroy_all