我需要知道何时使用:dependent => :destroy_all
以及何时使用:dependent => :destroy
如果我的模型有多个孩子模型,我使用:dependent => :destroy
会怎么样?它会摧毁第一个儿童模型吗?
这行代码错误:
has_many books, :dependent => :destroy
应该是这样的:
has_many books, :dependent => :destroy_all
答案 0 :(得分:4)
这将摧毁所有书籍。所有这些。
has_many books, :dependent => :destroy
要记住的一件重要事情是,:dependent => :destroy
会导致在每个相关图书中调用#destroy
方法。通过在每本书上调用#destroy
,将为每本书执行任何before_destroy
或after_destroy
回调。
当然,如果你有很多依赖书籍,这个过程可能会很昂贵。
:destroy_all
无效,也许您正在考虑:delete_all
。与:delete_all
(而不仅仅是:destroy
)的区别在于Rails将发出单个SQL语句来删除所有相关的书籍记录。不会在任何图书记录上调用#destroy
方法,也不会执行before_destroy
或after_destroy
回调。
好处是,单个SQL语句从数据库中删除记录的效率要比在每个语句上调用#destroy
高出许多倍。
这一点非常重要。如果您在Book模型上有任何*_destroy
回调,您应该知道定义:dependent => :delete_all
将会忽略您在Book模型上定义的任何回调。
答案 1 :(得分:0)
我很确定第一行是正确的,第二行是不正确的。
以下是文档中特定部分的链接:
我的理解是:dependent
将遍历关联并调用给定的函数,这意味着:destroy
是正确的调用。 (:destroy_all
仅对集合有效。)
我希望有所帮助。