ActiveRecordオブジェクトをどのように削除しますか?


回答:


572

それはだdestroydestroy_all同様、方法

user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)

別の方法としては、使用することができますdeleteし、delete_allこれは強制ではないでしょう:before_destroyし、:after_destroyコールバックや任意の従属関連のオプションを。

User.delete_all(condition: 'value') 主キーなしでレコードを削除できます

:@hammadyのコメントからuser.destroy、ユーザーモデルに主キーがない場合は機能しません。

注2:@ pavel-chuchuvaのコメントからdestroy_all、条件付きおよびdelete_all条件付きはRails 5.1で非推奨になりました-guides.rubyonrails.org/5_1_release_notes.htmlを参照してください


4
回答に@hammadyのコメントを含めていただければ幸いです。モデルオブジェクトを破棄できなかった理由を見つけるのに苦労しました...
the_critic


データベースのdeleted_at列のデータしか更新しないのはなぜですか?データの行全体を削除するにはどうすればよいですか?
TommyQu 2017

1
destroy_all with conditionsおよびdelete_all with conditionsはRails 5.1で非推奨になりました-guides.rubyonrails.org/5_1_release_notes.htmlを
Pavel Chuchuva

これUser.find_by(username:"bob") は、破棄または削除するレコードを特定するのにも適しています。
Barlop

60

ありdeletedelete_alldestroy、とdestroy_all

ドキュメントは次のとおりです。古いドキュメントRails 3.0.0のドキュメント

deleteオブジェクトをインスタンス化しませんが、インスタンス化しますdestroy。一般に、deleteよりも高速ですdestroy


4
deleteより高速ですが、モデルで定義したコールバックをバイパスします
Rudi

48
  1. User.destroy

User.destroy(1)でユーザーを削除しますid == 1し、:before_destroyそして:after_destroyコールバックが起こります。たとえば、レコードが関連付けられている場合

has_many :addresses, :dependent => :destroy

ユーザーが破壊された後、彼のアドレスも破壊されます。代わりに削除アクションを使用すると、コールバックは発生しません。

  1. User.destroyUser.delete

  2. User.destroy_all(<conditions>) または User.delete_all(<conditions>)

注意:ユーザーはクラスであり、ユーザーはインスタンスオブジェクトです


3
関連付けられているレコードにご対応いただきありがとうございます。
Sage Mitchell

2
User.destroy_all()注意:コールバックを実行するため、何かを削除する前に、レコードをロードします。1つではなく2つのSQLステートメントです。パフォーマンスへの影響とは別に、これには同時実行性への影響もあります。安全な呼び出しはコールバックをスキップします。User.delete_all()単一のDELETE FROM...コマンドのみを発行します。
Andrew Hodgkinson、2015

1
destroy_all with conditionsはRails 5.1で非推奨になりました-guides.rubyonrails.org/5_1_release_notes.htmlを
Pavel Chuchuva
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.