在rails指南中,它是这样描述的:
另外,如果对象与:dependent =>:destroy关联,则销毁对象;如果对象与:dependent =>:delete_all关联,则删除对象
对的,很酷。但是被摧毁和被删除有什么区别呢? 两种我都试过了,效果似乎是一样的。
在rails指南中,它是这样描述的:
另外,如果对象与:dependent =>:destroy关联,则销毁对象;如果对象与:dependent =>:delete_all关联,则删除对象
对的,很酷。但是被摧毁和被删除有什么区别呢? 两种我都试过了,效果似乎是一样的。
当前回答
在Rails的模型关联中,你可以指定:dependent选项,它可以采用以下三种形式之一:
:destroy/:destroy_all通过调用该对象的destroy方法,将关联的对象与该对象一起销毁 :delete/:delete_all所有关联对象立即被销毁,不需要调用它们的:destroy方法 :nullify所有关联对象的外键都被设置为NULL,而不调用它们的save回调
其他回答
实际上,主要的区别是:delete_all被使用时,任何回调都不会被调用。但是当使用:destroy回调堆栈(:after_destroy,:after_commit…)时将被触发。
因此,如果你在模型中删除了touch:ing声明,那么最好使用dependent::delete_all而不是'dependent::destroy'。
参见destroy删除其关联元素,其中delete_all可以从self表中删除多个数据,如delete * from表中field = 'xyz'
:依赖的可能选项:
控制关联对象的所有者被销毁时发生的情况。注意,这些被实现为回调,Rails按顺序执行回调。因此,其他类似的回调可能会影响:依赖行为,而:依赖行为可能会影响其他回调。
:destroy将导致所有关联对象同时被销毁。
:delete_all会导致所有关联对象直接从数据库中删除(因此回调将不会被执行)。
:nullify将外键设置为NULL。不执行回调。
:restrict_with_exception如果存在任何关联记录,将引发异常。
:restrict_with_error导致一个错误被添加到所有者,如果有任何关联对象。
如果使用:through选项,联接模型上的关联必须是belongs_to,被删除的记录是联接记录,而不是关联记录。
在Rails的模型关联中,你可以指定:dependent选项,它可以采用以下三种形式之一:
:destroy/:destroy_all通过调用该对象的destroy方法,将关联的对象与该对象一起销毁 :delete/:delete_all所有关联对象立即被销毁,不需要调用它们的:destroy方法 :nullify所有关联对象的外键都被设置为NULL,而不调用它们的save回调
区别在于回调函数。
:delete_all直接在你的应用程序中创建,并通过SQL进行删除:
DELETE * FROM users where compagny_id = XXXX
使用:destroy,会有所有子节点的实例化。所以,如果你不能破坏它或者如果每个都有自己的:依赖,它的回调可以被调用。