destroy vs destroy_all

sim*_*imo 5 activerecord ruby-on-rails-3

我需要知道何时使用:dependent => :destroy_all以及何时使用:dependent => :destroy

如果我的模型有很多儿童模特,我会用到:dependent => :destroy什么?它会破坏第一个儿童模型吗?

这行代码是错误的:

has_many books, :dependent => :destroy
Run Code Online (Sandbox Code Playgroud)

它是这样的:

has_many books, :dependent => :destroy_all
Run Code Online (Sandbox Code Playgroud)

Jor*_*jon 5

这将摧毁所有书籍。他们都。

has_many books, :dependent => :destroy
Run Code Online (Sandbox Code Playgroud)

要记住的一件重要事情是,这:dependent => :destroy将导致#destroy在每个关联的 Books 中调用该方法。通过调用#destroy每本书,将为每本书执行anybefore_destroyafter_destroy回调。

当然,如果您有很多相关书籍,则此过程可能会很昂贵。

:destroy_all是无效的,也许你在想些什么:delete_all。与:delete_all(而不仅仅是:destroy)的区别在于 Rails 将发出单个 SQL 语句来删除所有相关的书籍记录。不会#destroy对任何 Book 记录调用任何方法,也不会执行before_destroyafter_destroy回调。

好处是单个 SQL 语句从数据库中删除记录比调用#destroy每条记录的效率高很多倍。

了解这一点非常重要。如果您*_destroy在 Book 模型上有任何回调,您应该知道定义:dependent => :delete_all将产生忽略您在 Book 模型上定义的任何回调的效果。

  • 需要明确的是:这不会破坏“所有书籍……所有书籍”。它将销毁此模型所包含的书籍_many。第一句话的写法,听起来 Books.all.destroy 是我应该期待的。 (6认同)