我需要知道什么时候使用: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
方法。通过对每个Book调用#destroy
,任何before_destroy
或after_destroy
回调将对每个Book执行。
当然,如果你有很多依赖的书,这个过程可能会很昂贵。
:destroy_all
无效,也许您正在考虑:delete_all
。与:delete_all
(而不仅仅是:destroy
)的不同之处在于,Rails将发出一条SQL语句来删除所有相关的图书记录。任何Book记录都不会调用#destroy
方法,也不会执行before_destroy
或after_destroy
回调。
这样做的好处是,单个SQL语句从数据库中删除记录的效率比对每条记录调用#destroy
要高很多倍。
知道这一点很重要。如果您在Book模型上有任何*_destroy
回调,您应该知道定义:dependent => :delete_all
将会忽略您在Book模型上定义的任何回调。
我很确定第一行是正确的,第二行是错误的。
这里是文档中特定部分的链接:
http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html method-i-has_many-label-Options
我的理解是:dependent
将循环通过关联并调用给定的函数,这意味着:destroy
是要调用的正确函数。(:destroy_all
只对集合有效)