Active Recordのdelete、destroyの違い (Rails)

August 24, 2022

確認環境

$ bundle exec ruby --version
ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-darwin19]
$ bundle exec rails --version
Rails 6.0.4.6

Rails のコードの場所を調べる

Hoge というモデルが既に存在しているとします。

delete

$ rails c
...
irb(main):004:0> Hoge.last.method(:delete).source_location
=> ["/Users/xxxxx/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/activerecord-6.0.4.6/lib/active_record/persistence.rb", 518]

destroy

$ rails c
...
irb(main):009:0> Hoge.last.method(:destroy).source_location
=> ["/Users/xxxxx/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/activerecord-6.0.4.6/lib/active_record/transactions.rb", 309]

destroy!

$ rails c
...
irb(main):010:0> Hoge.last.method(:destroy!).source_location
=> ["/Users/xxxxx/.rbenv/versions/2.7.5/lib/ruby/gems/2.7.0/gems/activerecord-6.0.4.6/lib/active_record/persistence.rb", 550]

ソースのコメント箇所を見てみる

delete メソッドをみると callback が動作させる場合、destroy を使う必要があることが分かります。

また dependent オプションを使いたい場合も、destroy を使う必要があります。

 # To enforce the object's +before_destroy+ and +after_destroy+
 # callbacks or any <tt>:dependent</tt> association
 # options, use <tt>#destroy</tt>.

rails/persistence.rb at v6.0.4.6 · rails/rails


SHARE

Profile picture

Written by tamesuu