Rails:dependent => :destroy VS:dependent => :删除所有

时间:2010-05-09 10:27:24

标签: ruby-on-rails ruby model associations

在rails指南中,它的描述如下:

  

如果对象与:dependent => :destroy相关联,则对象将被销毁,如果与:dependent => :delete_all

相关联,则会被删除

对,很酷。但被摧毁和被删除之间的区别是什么? 我试过了两个,似乎做了同样的事情。

4 个答案:

答案 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'。