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
而不调用其save
callback
请参阅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函数。 但是使用时:destroy
callback堆栈( :after_destroy
, :after_commit
…)将被触发。
因此,如果你已经touch:
删除模型中的声明,最好使用dependent: :delete_all
而不是'dependent::destroy'。