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