Rails :dependent => :destroy VS :dependent => :delete_all Rails中的:dependent选项用于处理关联模型的依赖关系。它有两个可用的值::destroy和:delete_all。 :dependent => :destroy选项会在父模型被删除时,自动删除与之关联的子模型。这是通过调用子模型上的destroy方法来实现的。 相反,:dependent => :delete_all选项会在父模型被删除时,直接从数据库中删除与之关联的子模型
Rails :dependent => :destroy VS :dependent => :delete_all Rails中的:dependent选项用于处理关联模型的依赖关系。它有两个可用的值::destroy和:delete_all。 :dependent => :destroy选项会在父模型被删除时,自动删除与之关联的子模型。这是通过调用子模型上的destroy方法来实现的。 相反,:dependent => :delete_all选项会在父模型被删除时,直接从数据库中删除与之关联的子模型
在Rails指南中,描述如下:\n
\n如果对象与
:dependent => :destroy
相关联,则这些对象将被销毁;如果对象与:dependent => :delete_all
相关联,则这些对象将被删除。\n
\n是的,很好。但是被销毁和被删除之间有什么区别?\n我尝试了两种方式,似乎都是做同样的事情。
Rails中,当一个对象被销毁时,可以通过`:dependent`选项来控制其关联对象的处理方式。有两个可能的选项是`:destroy`和`:delete_all`。
`:destroy`选项会将所有关联的对象一起销毁。这意味着关联对象的数据会从数据库中被删除,并且会执行所有的回调。
`:delete_all`选项会直接从数据库中删除所有关联的对象,而不会执行任何回调。
这两个选项的使用取决于具体的需求。如果你希望在删除对象时也删除关联的对象,并执行所有的回调,那么应该使用`:destroy`选项。如果你只想直接从数据库中删除关联的对象,而不执行任何回调,那么应该使用`:delete_all`选项。
此外,还有其他几个可能的选项可以选择。使用`:nullify`选项时,外键将被设置为NULL,但不会执行任何回调。使用`:restrict_with_exception`选项时,如果存在关联记录,将会抛出一个异常。使用`:restrict_with_error`选项时,如果存在关联对象,将会向拥有者对象添加一个错误。
当使用`:through`选项时,关联模型上的关联必须是`belongs_to`,并且被删除的记录是连接记录,而不是关联的记录。
总之,Rails中的`:dependent`选项提供了灵活的方式来控制对象被销毁时关联对象的处理方式。根据具体的需求,可以选择使用`:destroy`或`:delete_all`来实现所需的行为。
在Rails模型关联中,可以使用:dependent
选项来指定关联对象的处理方式,该选项可以采用以下三种形式之一:
:destroy/:destroy_all
:通过调用关联对象的destroy
方法,同时销毁这些关联对象:delete/:delete_all
:立即销毁所有关联对象,而不调用它们的:destroy
方法:nullify
:将所有关联对象的外键设置为NULL
,而不调用它们的save
回调方法
在Rails 3.0之后,还可以使用:restrict
选项。如果将其设置为:restrict
,则不能删除具有任何关联对象的该对象。
根据文档,似乎不存在:delete
或:destroy_all
选项。但是,模型中有名为delete
和destroy_all
的类方法,这可能导致混淆的原因。
你可能还缺少一些选项,请查看:dependent
选项的可选值:[:destroy, :delete_all, :nullify, :restrict_with_error, :restrict_with_exception]
Rails中的:dependent => :destroy
和:dependent => :delete_all
之间的区别在于回调函数的使用。
:delete_all
直接在应用程序中执行SQL语句进行删除:
DELETE * FROM users where compagny_id = XXXX
而:destroy
会对所有子对象进行实例化。因此,如果无法销毁子对象或者每个子对象都有自己的:dependent
,则可能会调用它们的回调函数。
如果子对象很多,实例化和对每个子对象进行销毁的过程将会很慢(如果有孙子对象,则是n^2的效果)。delete_all
是一种"从轨道上摧毁"的解决方案,你不关心/没有任何销毁前/销毁后的回调函数。