#はじめに
先日、とあるアプリケーションを作成していて、deleteメソッド
とdestroyメソッド
のどちらを使うべきか、分からなくなってしまったので、備忘録も兼ねてアウトプットします!!
#deleteメソッドについて
指定した条件のレコードを、SQLを直接実行することで削除します。
ActiveRecordを介さないということなので、モデルを経由しません。
また、モデルで関連付けされているレコードがあったとしても、そちらは削除されません。
User.find(id: 1).delete
#destroyメソッドについて
ActiveRecordを介して、指定した条件のレコードを削除するメソッドです。
モデル内で、dependent: :destory
が設定されていれば、関連付けされているデータも併せて削除されます。
ActiveRecordを介しているので、callback
メソッドやバリデーションを機能させることもできます。
メソッドの実行時にエラーが発生し、削除ができなかった場合は、false
を返すだけで、例外は返却されません。
なので、「とりあえずデータを削除したいが、失敗した場合はエラーを返却してほしいな...」という場合は、destroy!メソッド
を使用すれば大丈夫です。
User.find(id: 1).destroy
例えば、Userモデルに多数のBookモデルが関連付けされている場合、id: 1
のユーザーが投稿したbook
に関しても、同時に削除がされることになります。
#ActiveRecordって何なん??
ActiveRecordとは、RubyとSQLの翻訳機
のようなイメージです。
本来、DBで使用されるDB言語には、SQLが使用されています。
しかし、Railsが開発してくれているActiveRecord
のおかげで、我々はRuby
を使用して、DBからデータを探したり、持って来れたり出来るというわけなのです!!
非常に便利な機能ですね。
#delete_allとdestroy_allについて
まとめて紹介しますが、こっちを使用すると、条件に合致する複数
のレコードを同時に削除することが可能です。
whereメソッド
と同時に使われることが多いです!!
Book.where(user_id: 1).delete_all
Book.where(user_id: 1).destroy_all
#おわりに
Railsには、似通っている機能が多数存在するので、混乱することも多いですが、一つ一つ丁寧に理解していくことが、上達への近道になりそうですね。