はじめに
以前、「updateとupdate_allの使い分け」という記事を書いたが、今回はそれのdelete版です。deleteとdelete_allの使い方の違いは、updateとupdate_allの使い方の違いと似ています。しかし、まったく同じではないので注意が必要です。
削除をするメソットにはdeleteの他にdestroyもあります。deleteとdelete_allの関係は、destroyとdestroy_allの関係と同じです。
環境
- Ubuntu 20.4
- Rails 5.2
- Ruby 2.6
delete、destroyの使い方
コントローラーの中で、findなどで1件だけ抽出したオブジェクトに対して、1件だけ削除するのが基本的な使い方です。
user = User.find(1)
user.delete
destroyも使い方は同じです。
user = User.find(1)
user.destroy
モデルの中でメソッドを作って、メソッドの中で削除することはできません。下記は共にエラーになります。
def delete_user
User.delete.where(name: "tana")
end
def destroy_user
User.destroy.where(name: "tana")
end
delete_all、destroy_allの使い方
delete_all、destroy_allはモデルの中で複数のデータを一括で削除する場合に利用します。結果的に削除データが1件しかなくても、delete_all、destroy_allは流れてくれます。
削除データが複数件存在する場合、複数件数分のDeleteのSQL文が発行されるような稚拙なことはしません。ちゃんと、DeleteのSQL文1回で削除してくれます。
def delete_user
User.delete_all(flg: "hoge").where(name: "tana")
end
def destroy_user
User.destroy_all(flg: "hoge").where(name: "tana")
end
コントローラーの中で、オブジェクトに対して削除させるような使い方はできません。共にエラーになります。
user = User.find(1)
user.delete_all
user = User.find(1)
user.destroy_all