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

Ser*_*gey 188 ruby model ruby-on-rails associations

在rails指南中,它的描述如下:

如果对象与之关联,则会另外销毁对象,如果与之关联则:dependent => :destroy删除对象:dependent => :delete_all

对,很酷.但被摧毁和被删除之间的区别是什么?我试过两个,它似乎做同样的事情.

shi*_*ara 196

不同之处在于回调.

:delete_all直接在您的应用程序中生成并由SQL删除:

DELETE * FROM users where compagny_id = XXXX
Run Code Online (Sandbox Code Playgroud)

有了这个:destroy,就有了你所有孩子的实例.因此,如果您无法销毁它或者每个都有自己的:dependent,则可以调用其回调.

  • 如果你有很多孩子,那么在每个子对象上实例化和调用destroy都会很慢(如果你有孙子,那么n ^ 2,依此类推).delete_all是一种"来自轨道的核武器"解决方案,你不关心/没有在模型上的任何前/后毁坏回调. (83认同)
  • "从轨道上取下来"是我的一天 (6认同)
  • 请参阅下面的新答案! (4认同)

Joh*_*ley 131

在Rails的模型关联上,您可以指定:dependent选项,该选项可以采用以下三种形式之一:

  • :destroy/:destroy_all通过调用它们的destroy方法,相关对象将与此对象一起销毁
  • :delete/:delete_all无需调用:destroy方法即可立即销毁所有关联对象
  • :nullify所有关联对象的外键都设置为NULL不调用其save回调

  • 从Rails 3.0开始,也可以指定`:restrict`._如果设置为:如果此对象具有任何关联对象,则无法将其删除._ (21认同)
  • 看起来没有`:delete`或`:destroy_all`选项吗?_The:dependent选项要么:destroy,:delete_all,:nullify或:restrict(:delete)_ (17认同)
  • 请参阅http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html(搜索"nullify")以获取权威的rdocs. (2认同)
  • @MikeCampbell,`:delete`和`:destroy_all`选项不存在.但是,模型上有类方法称为`delete`和`destroy_all`,因此可能是混淆的原因. (2认同)

Man*_*ava 30

销毁删除其相关元素 ,其中DELETE_ALL可以从自我删除表中的多个数据作为DELETE * FROM table where field = 'xyz'

:依赖可能的选择:

控制关联对象在其所有者被销毁时发生的情况.请注意,这些是作为回调实现的,Rails按顺序执行回调.因此,其他类似的回调可能会影响:依赖行为,并且该:dependent行为可能会影响其他回调.

:destroy 导致所有相关对象也被销毁.

:delete_all 导致所有关联的对象直接从数据库中删除(因此不会执行回调).

:nullify导致外键设置为NULL.回调不会执行.

:restrict_with_exception 如果存在任何关联记录,则会引发异常.

:restrict_with_error 如果存在任何关联对象,则会将错误添加到所有者.

如果使用该:through选项,则连接模型上的关联必须是belongs_to,而删除的记录是连接记录,而不是关联的记录.


atl*_*der 5

:delete_all实际上,主要区别在于使用时不会调用任何回调。但是当使用时,:destroy回调堆栈(:after_destroy:after_commit...)将被触发。

因此,如果要删除的模型中有touch:ing 声明,那么最好使用dependent: :delete_all“dependent: :destroy”。