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 destroy
ejecuta cualquier devolución de llamada en el modelo mientras delete
no 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_destroy
que se puede usar para detener ladestroy()
llamada final bajo ciertas condiciones.delete
solo eliminará el registro de objeto actual de db pero no sus registros secundarios asociados de db.destroy
eliminará 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
destroy
un objeto primario específico se eliminarán los objetos secundarios que se comparten entre otros múltiples padres.fuente
destroy
es 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
destroy
odestroy_all
sobre unActiveRecord
objeto, elActiveRecord
se inicia el proceso de 'destrucción', analiza la clase que está eliminando, determina qué debe hacer para las dependencias, ejecuta validaciones, etc.Cuando invoca
delete
odelete_all
sobre un objeto,ActiveRecord
simplemente intenta ejecutar laDELETE FROM tablename WHERE conditions
consulta en el DB, sin realizar otrasActiveRecord
tareas 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
delete
verbage funciona de manera diferente paraActiveRecord::Association.has_many
yActiveRecord::Base
. Para este último, eliminar ejecutaráSQL DELETE
y omitirá todas las validaciones / devoluciones de llamada. El primero se ejecutará en función de la:dependent
opción pasada a la asociación. Sin embargo, durante las pruebas, encontré el siguiente efecto secundario donde las devoluciones de llamada solo se ejecutarondelete
y nodelete_all
dependent: :destroy
Ejemplo:fuente