2012-03-31 8 views

risposta

23

In Mongoid (e anche ActiveRecord credo), delete solo rimuove l'oggetto dal database. destroy eliminerà l'oggetto ed eseguirà tutti i callback appropriati che il modello ha definito. Pertanto, se si dispone di una richiamata before_destroy su un modello e si è delete un'istanza di quel modello, la chiamata before_destroy non verrà richiamata.

Quindi dependent: :destroy esegue le richiamate del modello durante l'eliminazione e non lo fa dependent: :delete.

+0

quindi se non ho alcuna richiamata sono la stessa cosa? –

+2

Sì, probabilmente prenderei in considerazione l'uso di 'destroy'. Se si aggiunge una richiamata, è necessario ricordarsi di cambiarla da 'delete' a' destroy' a meno che non si desideri eseguire effettivamente la callback. –

+3

No, non sono la stessa cosa anche se non si dispone di callback. Poiché 'destroy' dipende dai callback, deve caricare il documento correlato per eseguire i callback e fare la query DELETE. 'delete' fa solo una query DELETE. Quindi, destroy è "più sicuro", ma delete è "più veloce" – tothemario

2
  • destroy esegue callback modello e quindi esegue una query REMOVE sul DB.
  • delete esegue semplicemente una query REMOVE sul DB.

I nomi sono presi da ActiveRecord, è per questo che non corrispondono molto bene a mongo.

È possibile vedere delete come ottimizzazione su destroy. Quando si utilizza destroy, si assicura che vengano eseguite le richiamate before_destroy, quindi viene eseguita una corretta pulizia. D'altra parte, se fai qualcosa come Model.destroy_all, deve caricare TUTTI gli elementi, e quindi fare una query REMOVE per ognuno di essi, sia che Model.delete_all faccia una sola query.