31
16

More than 3 years have passed since last update.

[Rails]deleteメソッドとdestroyメソッドの違いについて!![初心者]

Posted at

はじめに

先日、とあるアプリケーションを作成していて、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には、似通っている機能が多数存在するので、混乱することも多いですが、一つ一つ丁寧に理解していくことが、上達への近道になりそうですね。

31
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
16