through references rails has_one has_many has_and_belongs_to_many example create ruby-on-rails ruby model associations

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 de destroy
  • :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 en NULL sin llamar a sus callbacks de save

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.