区别:destroy和:delete for:依赖于has_one关联

时间:2015-07-14 18:07:35

标签: ruby-on-rails

在Rails文档Active Record Associations中,:dependent has_one的前2个值为:

4.2.2.4 :dependent

Controls what happens to the associated object when its owner is destroyed:

    :destroy causes the associated object to also be destroyed
    :delete causes the associated object to be deleted directly from the database (so callbacks will not execute)

我对:destroy的理解是,customer has_one address。使用:dependent => :destroy,如果删除了customer,则在从数据库中删除address后,customer将自动从数据库中删除,我们通常会使用:destroy。对:delete的使用是什么?

2 个答案:

答案 0 :(得分:4)

为了完成Jan的回答,destroy会在删除对象(并调用回调)之前将对象加载到内存中。基本上有一个很大的区别,因为使用delete避免了回调/验证,它可能会破坏参照完整性。

删除

使用SQL DELETE语句删除主键与id参数匹配的行,并返回已删除的行数。 Active Record对象未实例化,因此不执行对象的回调,包括任何:依赖关联选项。

您可以通过传递ID数组一次删除多行。

注意:虽然它通常比替代方法#destroy快得多,但跳过回调可能会绕过应用程序中的业务逻辑,从而确保参照完整性或执行其他重要工作。

<强>破坏

销毁具有给定id的对象(或多个对象)。首先实例化对象,因此在删除对象之前会触发所有回调和过滤器。此方法的效率低于ActiveRecord#delete,但允许运行清理方法和其他操作。

这实际上是找到具有给定id的对象(或多个对象),从属性创建一个新对象,然后在其上调用destroy。

http://apidock.com/rails/ActiveRecord/Relation/destroy

有关进一步的讨论,请看一下这篇文章 Difference between Destroy and Delete

答案 1 :(得分:3)

几乎都是这样,我几乎说,因为:

dependent :: destroy - 在关联对象中调用回调(before_destroy,after_destroy),然后你就能够中断事务(在回调中引发错误)。

依赖:: delete - 不调用回调(它通过SQL直接从数据库中删除对象,如DELETE FROM ... WHERE ...)