【Rails】delete・destroyメソッドでレコードを削除する方法

今回は、コンソールでレコードを削除する方法を紹介します。

UserモデルにPosts(投稿)モデルが1対多の関係にあるアプリを例に取ります。

destroyメソッド

destroyメソッドは、レコードを削除してくれるのですが、

対象のデータだけでなく、モデルクラスでdependent: :destroyを指定して関連付けたデータも一緒に削除します。以下で例を紹介します。

#書き方
User.find(3).destroy
#実行結果
User Load (48.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 3 LIMIT 1
  TRANSACTION (2.0ms)  BEGIN
  User Destroy (45.5ms)  DELETE FROM `users` WHERE `users`.`id` = 3
  TRANSACTION (13.3ms)  COMMIT
=> #<User id: 3, provider: "email", uid: "bbb@email.com", allow_password_change: [FILTERED], name: "bbb", nickname: nil, image: nil, email: "bbb@email.com", created_at: "2021-10-30 14:45:10.028308000 +0000", updated_at: "2021-10-30 14:45:10.224157000 +0000">

今回でいうと、User_id: 3を削除すればそれに紐づいたPostも削除されます。

destroy_all

このメソッドは、複数レコードを削除することができます。

#全てのUserレコードとそれに関連するレコード全て削除
User.destroy_all

#削除するレコードの範囲を指定
User.where(1..3).destroy_all

deleteメソッド

deleteメソッドもレコードを削除するメソッドなのですが、

destroyと違い、削除されるのは対象のデータだけで関連するデータは削除しません

#書き方
User.find(2).delete
#実行結果
User Load (39.5ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
  User Destroy (28.0ms)  DELETE FROM `users` WHERE `users`.`id` = 2
=> #<User id: 2, provider: "email", uid: "aaa@email.com", allow_password_change: [FILTERED], name: "aaa", nickname: nil, image: nil, email: "aaa@email.com", created_at: "2021-10-30 14:44:07.214314000 +0000", updated_at: "2021-10-30 14:44:30.811871000 +0000">

今回でいうと、User_id: 2を削除しても、それに紐づいていたPostは消えません。

delete_all

destroy_allと同じく、deleteにも複数データを消せるメソッドがあります。

delete_allはdeleteと同じで、関連するデータは削除しません。

#全てのUserレコードのみ削除
User.delete_all

#削除するレコードの範囲を指定
User.where(1..3).delete_all
タイトルとURLをコピーしました