mosowave

sinamon129による(主に)技術ブログ。Ruby,Ruby on Rails,Elasticsearchやその他について書きます。

has_manyのdependentパラメータの値がdestroyとdelete_allの時の違い[Rails]

Railsで、親のレコードと一緒に、関連する子のレコードも消したい時に、
has_manyのdependentパラメータにdestroyを選ぶべきか、delete_allを選ぶべきか迷った
(というか、何も考えずにdestroyをかいたら、delete_allでいいんじゃない?って言われて、違いをしらべた)
ので、メモ。

destroyの場合は、

class Parent < ActiveRecord::Base
  has_many :children, dependent: :destroy
end

Childrenクラスのインスタンスを生成して、destroyを実行していている。

delete_allの場合は、

class Parent < ActiveRecord::Base
  has_many :children, dependent: :delete_all
end

Childrenクラスのインスタンスを生成せずに、親のidを元にSQLを直接発行して削除している。

なので、

  • delete_allのほうが効率がよい(インスタンス生成が起こらないので)
  • destroyを使うときは、インスタンス生成することで追加で何か処理を行わないといけない時(deleteする前後に〜とか)

みたい。

※Rails3



【参考】