En las guías de rieles se describe así:
Además, los objetos se destruirán si están asociados
:dependent => :destroy
y se eliminarán si están asociados a:dependent => :delete_all
Bien, genial. Pero, ¿cuál es la diferencia entre ser destruido y ser eliminado? Intenté ambos y parece hacer lo mismo.
ruby-on-rails
ruby
model
associations
Sergey
fuente
fuente
En una asociación de modelo de Rails, puede especificar la
:dependent
opción, que puede tomar una de las siguientes tres formas::destroy/:destroy_all
Los objetos asociados se destruyen junto con este objeto llamando a sudestroy
método:delete/:delete_all
Todos los objetos asociados se destruyen inmediatamente sin llamar a su:destroy
método.:nullify
Las claves externas de todos los objetos asociados se configuranNULL
sin llamar a sussave
devoluciones de llamadafuente
:restrict
. Si se establece en: restringir este objeto no se puede eliminar si tiene algún objeto asociado.:delete
o:destroy_all
por lo que parece? La opción: dependiente espera: destroy,: delete_all,: nullify o: restrict (: delete):delete
y las:destroy_all
opciones no existen. Sin embargo, hay métodos de clase en los modelos que se llamandelete
y,destroy_all
por lo tanto, podría ser el motivo de confusión.Ver destruir elimina sus elementos asociados donde delete_all puede eliminar múltiples datos de la tabla propia como
DELETE * FROM table where field = 'xyz'
: Opciones posibles dependientes:
Controla lo que sucede con los objetos asociados cuando su propietario es destruido. 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
:dependent
comportamiento puede afectar otras devoluciones de llamada.:destroy
hace que todos los objetos asociados también sean destruidos.:delete_all
hace que todos los objetos asociados se eliminen directamente de la base de datos (por lo que no se ejecutarán las devoluciones de llamada).:nullify
hace que las claves foráneas se establezcan en NULL. Las devoluciones de llamada 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
:through
opción, la asociación en el modelo de unión debe ser un pertenece a, y los registros que se eliminan son los registros de unión, en lugar de los registros asociados.fuente
En realidad, la principal diferencia es que no se invocará ninguna devolución de llamada cuando
:delete_all
se usó. Pero cuando se usa:destroy
la pila de devoluciones de llamada (:after_destroy
,:after_commit
...) se disparará.En consecuencia, si tiene
touch:
declaraciones que se están eliminando en los modelos, es mejor usardependent: :delete_all
'dependiente: destruir'.fuente