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_allLos objetos asociados se destruyen junto a este objeto llamando a su método dedestroy -
:delete/:delete_allTodos los objetos asociados se destruyen inmediatamente sin llamar a su método:destroy -
:nullifyTodas las claves externas de los objetos asociados se establecen enNULLsin 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.