在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
的使用是什么?
答案 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 ...)