Rails :dependent => :destroy VS :dependent => :delete_all Rails中的:dependent选项用于处理关联模型的依赖关系。它有两个可用的值::destroy和:delete_all。 :dependent => :destroy选项会在父模型被删除时,自动删除与之关联的子模型。这是通过调用子模型上的destroy方法来实现的。 相反,:dependent => :delete_all选项会在父模型被删除时,直接从数据库中删除与之关联的子模型

21 浏览
0 Comments

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我尝试了两种方式,似乎都是做同样的事情。

0
0 Comments

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`来实现所需的行为。

0
0 Comments

在Rails模型关联中,可以使用:dependent选项来指定关联对象的处理方式,该选项可以采用以下三种形式之一:

  • :destroy/:destroy_all:通过调用关联对象的destroy方法,同时销毁这些关联对象
  • :delete/:delete_all:立即销毁所有关联对象,而不调用它们的:destroy方法
  • :nullify:将所有关联对象的外键设置为NULL,而不调用它们的save回调方法

在Rails 3.0之后,还可以使用:restrict选项。如果将其设置为:restrict,则不能删除具有任何关联对象的该对象。

根据文档,似乎不存在:delete:destroy_all选项。但是,模型中有名为deletedestroy_all的类方法,这可能导致混淆的原因。

你可能还缺少一些选项,请查看:dependent选项的可选值:[:destroy, :delete_all, :nullify, :restrict_with_error, :restrict_with_exception]

0
0 Comments

Rails中的:dependent => :destroy:dependent => :delete_all之间的区别在于回调函数的使用。

:delete_all直接在应用程序中执行SQL语句进行删除:

DELETE * FROM users where compagny_id = XXXX

:destroy会对所有子对象进行实例化。因此,如果无法销毁子对象或者每个子对象都有自己的:dependent,则可能会调用它们的回调函数。

如果子对象很多,实例化和对每个子对象进行销毁的过程将会很慢(如果有孙子对象,则是n^2的效果)。delete_all是一种"从轨道上摧毁"的解决方案,你不关心/没有任何销毁前/销毁后的回调函数。

0