2012-03-31 54 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是否僅生成一個查詢。