destroy vs destroy_all

时间:2013-01-06 22:32:21

标签: ruby-on-rails-3 activerecord

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

如果我的模型有多个孩子模型,我使用:dependent => :destroy会怎么样?它会摧毁第一个儿童模型吗?

这行代码错误:

has_many books, :dependent => :destroy

应该是这样的:

has_many books, :dependent => :destroy_all

2 个答案:

答案 0 :(得分:4)

这将摧毁所有书籍。所有这些。

has_many books, :dependent => :destroy

要记住的一件重要事情是,:dependent => :destroy会导致在每个相关图书中调用#destroy方法。通过在每本书上调用#destroy,将为每本书执行任何before_destroyafter_destroy回调。

当然,如果你有很多依赖书籍,这个过程可能会很昂贵。

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

好处是,单个SQL语句从数据库中删除记录的效率要比在每个语句上调用#destroy高出许多倍。

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

答案 1 :(得分:0)

我很确定第一行是正确的,第二行是不正确的。

以下是文档中特定部分的链接:

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many-label-Options

我的理解是:dependent将遍历关联并调用给定的函数,这意味着:destroy是正确的调用。 (:destroy_all仅对集合有效。)

我希望有所帮助。