今回は、コンソールでレコードを削除する方法を紹介します。
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