ruby on rails - references - Rails: dependent=>: destroy VS: dependent=>: delete_all
rails references (4)
En la asociación de modelos de Rails puede especificar la opción :dependent
, que puede tomar una de las siguientes tres formas:
-
:destroy/:destroy_all
Los objetos asociados se destruyen junto a este objeto llamando a su método dedestroy
-
:delete/:delete_all
Todos los objetos asociados se destruyen inmediatamente sin llamar a su método:destroy
-
:nullify
Todas las claves externas de los objetos asociados se establecen enNULL
sin llamar a sus callbacks desave
En las guías de rieles se describe así:
Los objetos se destruirán además si están asociados con
:dependent => :destroy
, y se eliminan si están asociados con:dependent => :delete_all
Bien, genial. ¿Pero cuál es la diferencia entre ser destruido y ser eliminado? Intenté ambos y parece hacer lo mismo.
En realidad, la principal diferencia es que no se invocarán las devoluciones de llamada cuando :delete_all
se utilizó :delete_all
. Pero cuando se usa :destroy
la pila de devoluciones de llamada ( :after_destroy
:after_commit
...) se disparará.
En consecuencia, si tiene declaraciones touch:
en modelos que se eliminan, entonces es mejor usar dependent: :delete_all
rather ''dependent:: destroy''.
La diferencia es con la devolución de llamada.
El :delete_all
se realiza directamente en su aplicación y se elimina por SQL:
DELETE * FROM users where compagny_id = XXXX
Con :destroy
, hay una instanciación de todos tus hijos. Entonces, si no puede destruirlo o si cada uno tiene el suyo propio :dependent
, se pueden llamar sus devoluciones de llamada.
Ver destruir elimina sus elementos asociados donde delete_all puede eliminar datos múltiples de la tabla propia como DELETE * FROM table where field = ''xyz''
: Opciones posibles dependientes:
Controla qué sucede con los objetos asociados cuando se destruye su propietario. Tenga en cuenta que estos se implementan como devoluciones de llamada, y Rails ejecuta devoluciones de llamada en orden. Por lo tanto, otras devoluciones de llamada similares pueden afectar el comportamiento dependiente y el comportamiento :dependent
puede afectar otras devoluciones de llamada.
:destroy
hace que todos los objetos asociados también se destruyan.
:delete_all
hace que todos los objetos asociados se eliminen directamente de la base de datos (por lo que las devoluciones de llamada no se ejecutarán).
:nullify
hace que las claves foráneas se establezcan en NULL. Las rellamadas no se ejecutan.
:restrict_with_exception
hace que se genere una excepción si hay registros asociados.
:restrict_with_error
hace que se agregue un error al propietario si hay algún objeto asociado.
Si se usa con la opción :through
, la asociación en el modelo de unión debe ser un belongs_to, y los registros que se eliminan son los registros de unión, en lugar de los registros asociados.