在rails指南中,它的描述如下:
如果对象与
相关联,则会被删除:dependent => :destroy
相关联,则对象将被销毁,如果与:dependent => :delete_all
对,很酷。但被摧毁和被删除之间的区别是什么? 我试过了两个,似乎做了同样的事情。
答案 0 :(得分:193)
不同之处在于回调。
:delete_all
直接在您的应用程序中生成,并由SQL删除:
DELETE * FROM users where compagny_id = XXXX
使用:destroy
,可以实现所有孩子的实例化。因此,如果您无法销毁它或每个都有自己的:dependent
,则可以调用其回调。
答案 1 :(得分:131)
在Rails的模型关联中,您可以指定:dependent
选项,该选项可以采用以下三种形式之一:
:destroy/:destroy_all
通过调用destroy
方法:delete/:delete_all
所有关联的对象都会在不调用:destroy
方法:nullify
所有关联对象的外键设置为NULL
,而不调用其save
回调答案 2 :(得分:30)
请参阅销毁删除其相关元素,其中 delete_all可以将自我表中的多个数据删除为DELETE * FROM table where field = 'xyz'
:依赖可能的选项:
控制关联对象在其所有者被销毁时发生的情况。请注意,这些是作为回调实现的,Rails按顺序执行回调。因此,其他类似的回调可能会影响:依赖行为,:dependent
行为可能会影响其他回调。
:destroy
导致所有相关对象也被销毁。
:delete_all
导致所有关联对象直接从数据库中删除(因此不会执行回调)。
:nullify
会将外键设置为NULL。回调不会被执行。
:restrict_with_exception
会引发异常。
:restrict_with_error
会将错误添加到所有者。
如果使用:through
选项,则连接模型上的关联必须是belongs_to,而删除的记录是连接记录,而不是关联的记录。
答案 3 :(得分:2)
实际上,主要区别在于使用:delete_all
时不会调用任何回调。但是当使用:destroy
时,将触发回调堆栈(:after_destroy
,:after_commit
...)。
因此,如果您在模型中删除了touch:
个声明,那么最好使用dependent: :delete_all
而不是'dependent :: destroy'。