Nos guias de trilhos, é descrito assim:
Além disso, os objetos serão destruídos se estiverem associados
:dependent => :destroy
e excluídos se estiverem associados a:dependent => :delete_all
Certo, legal. Mas qual é a diferença entre ser destruído e excluído? Eu tentei os dois e parece fazer a mesma coisa.
ruby-on-rails
ruby
model
associations
Sergey
fonte
fonte
Na associação de modelo do Rails, você pode especificar a
:dependent
opção, que pode assumir uma das três formas a seguir::destroy/:destroy_all
Os objetos associados são destruídos ao lado desse objeto chamando seudestroy
método:delete/:delete_all
Todos os objetos associados são destruídos imediatamente sem chamar seu:destroy
método:nullify
As chaves estrangeiras de todos os objetos associados são definidas comoNULL
sem chamar seussave
retornos de chamadafonte
:restrict
. Se definido como: restringir este objeto, não poderá ser excluído se houver algum objeto associado.:delete
ou:destroy_all
pelo que parece? A opção: dependent espera que seja: destruir,: delete_all,: anular ou: restringir (: delete):delete
e as:destroy_all
opções não existem. No entanto, existem métodos de classe nos modelos chamadosdelete
e,destroy_all
portanto, esse pode ser o motivo da confusão.Consulte destroy exclui seus elementos associados, em que delete_all pode excluir vários dados da tabela própria como
DELETE * FROM table where field = 'xyz'
: Opções possíveis dependentes:
Controla o que acontece com os objetos associados quando o proprietário é destruído. Observe que eles são implementados como retornos de chamada, e o Rails executa retornos de chamada em ordem. Portanto, outros retornos de chamada semelhantes podem afetar o comportamento: dependente e o
:dependent
comportamento pode afetar outros retornos de chamada.:destroy
faz com que todos os objetos associados também sejam destruídos.:delete_all
faz com que todos os objetos associados sejam excluídos diretamente do banco de dados (portanto, os retornos de chamada não serão executados).:nullify
faz com que as chaves estrangeiras sejam definidas como NULL. Os retornos de chamada não são executados.:restrict_with_exception
faz com que uma exceção seja gerada se houver algum registro associado.:restrict_with_error
faz com que um erro seja adicionado ao proprietário se houver algum objeto associado.Se estiver usando com a
:through
opção, a associação no modelo de junção deve ser perten_to e os registros que são excluídos são os registros de junção, e não os registros associados.fonte
Na verdade, a principal diferença é que nenhum retorno de chamada será invocado quando
:delete_all
foi usado. Mas quando usada,:destroy
a pilha de retornos de chamada (:after_destroy
,:after_commit
...) será acionada.Conseqüentemente, se você tiver
touch:
declarações em modelos sendo excluídas, é melhor usardependent: :delete_all
'dependente:: destroy'.fonte