Rails:dependent =>:destroy VS:dependent =>:delete_all

在导轨中,它是这样描述的:

对象将被另外销毁,如果它们与:dependent => :destroy相关联,并且被删除,如果它们与:dependent => :delete_all

对,很酷。 但被破坏和被删除有什么区别? 我试了两次,似乎也是这样做的。

区别在于callback。

:delete_all直接在您的应用程序中进行,并通过SQL删除:

 DELETE * FROM users where compagny_id = XXXX 

随着:destroy ,有一个你的孩子的例子。 所以,如果你不能摧毁它,或者如果每个人都有自己的:dependent ,它的callback可以被调用。

在Rails的模型关联中,你可以指定:dependent选项,它可以采用以下三种forms之一:

  • :destroy/:destroy_all关联的对象通过调用它们的destroy方法被destroy
  • :delete/:delete_all所有关联的对象都会被立即销毁,而不会调用它们:destroy方法
  • :nullify所有关联对象的外键都设置为NULL而不调用其savecallback

请参阅destroy删除其关联的元素 ,其中delete_all可以从自己的表中删除多个数据 DELETE * FROM table where field = 'xyz'

:从属可能的select:

控制关联对象在其所有者被销毁时发生的情况。 请注意,这些以callback方式实现,Rails按顺序执行callback。 因此,其他类似的callback可能会影响:依赖行为, :dependent行为可能会影响其他callback。

:destroy导致所有关联的对象也被销毁。

:delete_all导致所有关联的对象直接从数据库中删除(所以callback将不会被执行)。

:nullify导致外键被设置为NULL。 callback不执行。

:restrict_with_exception如果有任何关联的logging, :restrict_with_exception会引发exception。

:restrict_with_error如果有任何关联的对象, :restrict_with_error会导致错误被添加到所有者。

如果使用with :through选项,则连接模型上的关联必须是belongs_to,而被删除的logging是连接logging,而不是关联的logging。

其实最主要的区别是,在使用:delete_all时,不会调用任何callback函数。 但是使用时:destroycallback堆栈( :after_destroy:after_commit …)将被触发。

因此,如果你已经touch:删除模型中的声明,最好使用dependent: :delete_all而不是'dependent::destroy'。