ruby-on-rails - method - rails remove relation
Diferencia entre Destruir y Eliminar (5)
Básicamente destroy
ejecuta cualquier devolución de llamada en el modelo mientras que delete
no lo hace.
Desde 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 conservar). Devuelve la instancia congelada.
La fila simplemente se elimina con una sentencia SQL DELETE en la clave principal de la grabación, y no se ejecutan callbacks.
Para aplicar las devoluciones de llamada before_destroy y after_destroy del objeto o cualquier opción de asociación dependiente, 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 conservar).
Hay una serie de devoluciones de llamada asociadas con destroy. Si la devolución de llamada before_destroy devuelve false, la acción se cancela y destroy devuelve false. Ver ActiveRecord :: Callbacks para más detalles.
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 o el otro?
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 están en el registro que está borrando ni si hay devoluciones de llamadas (como before_destroy
).
El método "destruir" toma la identificación pasada, saca el modelo de la base de datos usando el método "buscar", luego llama a destruir sobre eso. Esto significa que se activan las devoluciones de llamada.
Desearía 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".
Cuando invoca destroy
o destroy_all
en un objeto ActiveRecord
, se inicia el proceso de ''destrucción'' de ActiveRecord
, analiza la clase que está eliminando, determina qué debe hacer para las dependencias, ejecuta validaciones, etc.
Cuando invoca delete
o delete_all
en un objeto, ActiveRecord
simplemente intenta ejecutar el DELETE FROM tablename WHERE conditions
query contra el db, sin realizar ninguna otra tarea ActiveRecord
level.
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 llamen las devoluciones de llamada del modelo.
Si te importan las devoluciones de llamada de tus modelos, utiliza destroy_all
De los documentos oficiales
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
destroy_all (conditions = nil) public
Destruye las condiciones de coincidencia de registros instanciando cada registro y llamando a su método de destrucción. Las devoluciones de llamada de cada objeto se ejecutan (incluidas las opciones de asociación dependiente y los métodos before_destroy / after_destroy Observer). Devuelve la colección de objetos que fueron destruidos; cada uno se congelará, para reflejar que no se deben hacer cambios (ya que no pueden persistir).
Nota: la creación de instancias, la ejecución de devolución de llamada y la eliminación de cada registro pueden consumir mucho tiempo al eliminar muchos registros a la vez. Genera al menos una consulta SQL DELETE por registro (o posiblemente más, para hacer cumplir sus devoluciones de llamada). Si desea eliminar muchas filas rápidamente, sin preocuparse por sus asociaciones o devoluciones de llamada, use delete_all en su lugar.
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 sus registros secundarios asociados de db.
Su uso realmente importa:
Si sus objetos principales múltiples comparten objetos secundarios comunes, al llamar a destroy
en objetos primarios específicos eliminará los objetos secundarios que se comparten entre otros padres múltiples.