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?

Author: dodexahedron, 2014-03-31

5 answers

Básicamente destroy ejecuta cualquier devolución de llamada en el modelo mientras que delete no lo hace.

Desde la API 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 se elimina simplemente con una instrucción SQL DELETE en la clave principal del registro, y no se ejecutan devoluciones de llamada.

    A haga cumplir 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.

 229
Author: Community,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-05 21:56:58

delete solo eliminará el registro de 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 objetos padre múltiples comparten objetos hijos comunes, entonces llamar a destroy en un objeto padre específico eliminará los objetos hijos que se comparten entre otros padres múltiples.

 72
Author: Taimoor Changaiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-24 10:31:21

Cuando invoca destroy o destroy_all en un objeto ActiveRecord, se inicia el proceso de 'destrucción' 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 la consulta DELETE FROM tablename WHERE conditions contra la base de datos, sin realizar otras tareas de nivel ActiveRecord.

 12
Author: nickcen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-27 10:36:56

Sí hay una diferencia importante 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 preocupas por las devoluciones de llamada de tus modelos, usa destroy_all

De los documentos oficiales

Http://apidock.com/rails/ActiveRecord/Base/destroy_all/class

Destroy_all (conditions = nil) public

Destruye las condiciones coincidentes de los registros instanciando cada registro y llamando a su método destroy. Se ejecutan las devoluciones de llamada de cada objeto (incluyendo :opciones de asociación dependiente y before_destroy / after_destroy Observer methods). Devuelve la colección de objetos que fueron destruidos; cada uno será congelado, para reflejar que no se deben hacer cambios (ya que no se pueden persistir).

Nota: Creación de instancias, ejecución de devolución de llamada y eliminación de cada registro puede llevar mucho tiempo cuando eliminas muchos registros a la vez. Se genera al menos uno SQL ELIMINAR consulta 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.

 4
Author: jamesc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-31 09:02:21

Básicamente "delete" 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á borrando ni si hay devoluciones de llamada (como before_destroy).

El método "destroy" toma el id pasado, obtiene el modelo de la base de datos usando el método "find", luego llama a destroy en ese. Esto significa que se activan las devoluciones de llamada.

Debería usar "eliminar" si no desea que se activen las devoluciones de llamada o si quiero un mejor rendimiento. De lo contrario (y la mayoría de las veces) querrá usar "destruir".

 2
Author: Severin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-31 09:01:56