2012-03-31 53 views

回答

23

在Mongoid(也ActiveRecord的,我相信),delete刚从数据库中删除对象。 destroy将删除该对象并运行该模型定义的所有适当的回调。因此,如果您在模型上有before_destroy回调,而您的delete模型为实例,则不会调用before_destroy回调。

因此dependent: :destroy删除时运行模型的回调,dependent: :delete不运行。

+0

所以如果我没有任何回调他们是同样的事情? – 2012-03-31 14:49:28

+2

是的,我可能会考虑使用'destroy'。如果你添加了一个回调函数,除非你不希望回调函数实际运行,否则你需要记住将它从'delete'改为'destroy'。 – 2012-03-31 14:59:06

+3

即使你没有回调,它们也不是一回事。由于'destroy'依赖于回调,因此必须加载相关文档以执行回调,并执行DELETE查询。 'delete'只是一个DELETE查询。 然后,销毁是“更安全”,但删除是“更快” – tothemario 2014-04-15 18:17:03

2
  • destroy运行模型回调,然后对数据库执行REMOVE查询。
  • delete只是对数据库执行REMOVE查询。

这些名字取自ActiveRecord,这就是为什么他们不符合mongo很好。

你可以看到delete作为destroy的优化。当您使用destroy时,请确保执行before_destroy回调,以便完成适当的清理。另一方面,如果您执行类似Model.destroy_all的操作,则必须加载所有元素,然后为其中的每个元素执行REMOVE查询,无论Model.delete_all是否仅生成一个查询。