Diferencia entre destruir y eliminar
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 uno u otro?
Básicamente destroy
ejecuta cualquier devolución de llamada en el modelo mientras delete
no lo hace.
Desde la API de rieles :
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 conservar). Devuelve la instancia congelada.
La fila simplemente se elimina con una instrucción DELETE de SQL en la clave principal del registro y no se ejecutan devoluciones de llamada.
Para aplicar las devoluciones de llamada before_destroy y after_destroy del objeto o cualquier opción de asociación dependiente, utilice #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 conservar).
Hay una serie de devoluciones de llamada asociadas con la destrucción. Si la devolución de llamada before_destroy devuelve falso, la acción se cancela y destruir devuelve falso. Consulte ActiveRecord::Callbacks para obtener más detalles.
delete
solo eliminará el registro del objeto actual de la base de datos, pero no sus registros secundarios asociados de la base de datos.
destroy
eliminará el registro del objeto actual de la base de datos y también su registro secundario asociado de la base de datos.
Su uso realmente importa:
Si sus múltiples objetos principales comparten objetos secundarios comunes, al llamar destroy
a un objeto principal específico se eliminarán los objetos secundarios que se comparten entre otros múltiples padres.
Cuando invocas destroy
o destroy_all
sobre un ActiveRecord
objeto, ActiveRecord
se inicia el proceso de 'destrucción', analiza la clase que estás eliminando, determina qué debe hacer para las dependencias, ejecuta validaciones, etc.
Cuando invoca delete
o delete_all
en un objeto, ActiveRecord
simplemente intenta ejecutar la DELETE FROM tablename WHERE conditions
consulta en la base de datos, sin realizar otras ActiveRecord
tareas de nivel.