2012-03-31 15 views

Respuesta

23

En Mongoid (y también ActiveRecord creo), delete solo elimina el objeto de la base de datos. destroy eliminará el objeto y ejecutará todas las devoluciones de llamada apropiadas que el modelo haya definido. Por lo tanto, si tiene una devolución de llamada before_destroy en un modelo y delete una instancia de ese modelo, no se llamará a la devolución de llamada before_destroy.

Por lo tanto, dependent: :destroy ejecuta las devoluciones de llamada del modelo al eliminar y dependent: :delete no lo hace.

+0

así que si no tengo ninguna devolución de llamada, ¿son lo mismo? –

+2

Sí, probablemente consideraría usar 'destroy'. Si alguna vez agregas una devolución de llamada, deberás recordar cambiarla de 'borrar' a' destruir' a menos que no quieras que se ejecute realmente la devolución de llamada. –

+3

No, no son lo mismo, incluso si no tiene devoluciones de llamada. Como 'destroy' depende de las devoluciones de llamada, tiene que cargar el documento relacionado para ejecutar las devoluciones de llamada, y hacer la consulta DELETE. 'delete' solo hace una consulta DELETE. Entonces, destruir es "más seguro", pero eliminar es "más rápido" – tothemario

2
  • ejecuta las devoluciones de llamada del modelo y luego realiza una consulta REMOVE a la base de datos.
  • delete solo hace una consulta REMOVE a la base de datos.

Los nombres están tomados de ActiveRecord, es por eso que no coinciden muy bien con mongo.

Puede ver delete como una optimización sobre destroy. Cuando utiliza destroy, se asegura de que se ejecuten callbacks before_destroy, por lo que se realiza una limpieza adecuada. Por otro lado, si hace algo como Model.destroy_all, tiene que cargar TODOS los elementos, y luego hacer una consulta REMOVE para cada uno de ellos, ya sea que Model.delete_all haga solo una consulta.