Cuál es la diferencia entre
@model.destroy y @model.delete
Por ejemplo:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
¿Realmente importa si uso el uno o el otro?
fuente
Cuál es la diferencia entre
@model.destroy y @model.delete
Por ejemplo:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
¿Realmente importa si uso el uno o el otro?
Básicamente destroyejecuta cualquier devolución de llamada en el modelo mientras deleteno lo hace.
De la API de Rails :
ActiveRecord::Persistence.delete
Elimina el registro en la base de datos y congela esta instancia para reflejar que no se deben realizar cambios (ya que no se pueden persistir). Devuelve la instancia congelada.
La fila simplemente se elimina con una instrucción DELETE de SQL en la clave primaria del registro, y no se ejecutan devoluciones de llamada.
Para aplicar las devoluciones de llamada antes_destruir y después_destruir del objeto o cualquiera: opciones de asociación dependientes, use #destroy.
ActiveRecord::Persistence.destroy
Elimina el registro en la base de datos y congela esta instancia para reflejar que no se deben realizar cambios (ya que no se pueden persistir).
Hay una serie de devoluciones de llamada asociadas con destruir. Si la devolución de llamada before_destroy devuelve falso, la acción se cancela y destruir devuelve falso. Vea ActiveRecord :: Callbacks para más detalles.
model#before_destroyque se puede usar para detener ladestroy()llamada final bajo ciertas condiciones.deletesolo eliminará el registro de objeto actual de db pero no sus registros secundarios asociados de db.destroyeliminará el registro de objeto actual de db y también su registro secundario asociado de db.Su uso realmente importa:
Si sus múltiples objetos primarios comparten objetos secundarios comunes, al invocar
destroyun objeto primario específico se eliminarán los objetos secundarios que se comparten entre otros múltiples padres.fuente
destroyes descendientes , no hijos : de acuerdo con la documentación, destruir "crea un nuevo objeto a partir de los atributos, y luego llama a destruir en él". rubydoc.info/docs/rails/4.1.7/ActiveRecord%2FRelation:destroyCuando invoca
destroyodestroy_allsobre unActiveRecordobjeto, elActiveRecordse inicia el proceso de 'destrucción', analiza la clase que está eliminando, determina qué debe hacer para las dependencias, ejecuta validaciones, etc.Cuando invoca
deleteodelete_allsobre un objeto,ActiveRecordsimplemente intenta ejecutar laDELETE FROM tablename WHERE conditionsconsulta en el DB, sin realizar otrasActiveRecordtareas de nivel.fuente
Sí, existe una gran diferencia entre los dos métodos. Use delete_all si desea que los registros se eliminen rápidamente sin que se llame a las devoluciones de llamada del modelo
Si te interesan las devoluciones de llamada de tus modelos, usa destroy_all
De los documentos oficiales
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
fuente
Básicamente, "eliminar" envía una consulta directamente a la base de datos para eliminar el registro. En ese caso, Rails no sabe qué atributos hay en el registro que está eliminando ni si hay devoluciones de llamada (como
before_destroy).El método "destroy" toma la identificación pasada, recupera el modelo de la base de datos usando el método "find" y luego llama a destroy en ese caso. Esto significa que se activan las devoluciones de llamada.
Desea usar "eliminar" si no desea que se activen las devoluciones de llamada o si desea un mejor rendimiento. De lo contrario (y la mayoría de las veces) querrá usar "destruir".
fuente
Muchas respuestas ya; quería saltar con un poco más.
docs :
El
deleteverbage funciona de manera diferente paraActiveRecord::Association.has_manyyActiveRecord::Base. Para este último, eliminar ejecutaráSQL DELETEy omitirá todas las validaciones / devoluciones de llamada. El primero se ejecutará en función de la:dependentopción pasada a la asociación. Sin embargo, durante las pruebas, encontré el siguiente efecto secundario donde las devoluciones de llamada solo se ejecutarondeletey nodelete_alldependent: :destroyEjemplo:fuente