En las guías de rieles se describe así:
Además, los objetos se destruirán si están asociados
:dependent => :destroyy 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
:dependentopción, que puede tomar una de las siguientes tres formas::destroy/:destroy_allLos objetos asociados se destruyen junto con este objeto llamando a sudestroymétodo:delete/:delete_allTodos los objetos asociados se destruyen inmediatamente sin llamar a su:destroymétodo.:nullifyLas claves externas de todos los objetos asociados se configuranNULLsin llamar a sussavedevoluciones de llamadafuente
:restrict. Si se establece en: restringir este objeto no se puede eliminar si tiene algún objeto asociado.:deleteo:destroy_allpor lo que parece? La opción: dependiente espera: destroy,: delete_all,: nullify o: restrict (: delete):deletey las:destroy_allopciones no existen. Sin embargo, hay métodos de clase en los modelos que se llamandeletey,destroy_allpor 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
:dependentcomportamiento puede afectar otras devoluciones de llamada.:destroyhace que todos los objetos asociados también sean destruidos.:delete_allhace que todos los objetos asociados se eliminen directamente de la base de datos (por lo que no se ejecutarán las devoluciones de llamada).:nullifyhace que las claves foráneas se establezcan en NULL. Las devoluciones de llamada no se ejecutan.:restrict_with_exceptionhace que se genere una excepción si hay registros asociados.:restrict_with_errorhace que se agregue un error al propietario si hay algún objeto asociado.Si se usa con la
:throughopció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_allse usó. Pero cuando se usa:destroyla 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