Qual é a diferença entre
@model.destroy
e @model.delete
Por exemplo:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Realmente importa se eu uso um ou outro?
fonte
Qual é a diferença entre
@model.destroy
e @model.delete
Por exemplo:
Model.find_by(col: "foo").destroy_all
//and
Model.find_by(col: "foo").delete_all
Realmente importa se eu uso um ou outro?
Basicamente, destroy
executa quaisquer retornos de chamada no modelo enquanto delete
não.
ActiveRecord::Persistence.delete
Exclui o registro no banco de dados e congela esta instância para refletir que nenhuma alteração deve ser feita (pois não pode ser persistida). Retorna a instância congelada.
A linha é simplesmente removida com uma instrução SQL DELETE na chave primária do registro e nenhum retorno de chamada é executado.
Para impor os retornos de chamada before_destroy e after_destroy do objeto ou qualquer outra opção de associação dependente, use #destroy.
ActiveRecord::Persistence.destroy
Exclui o registro no banco de dados e congela esta instância para refletir que nenhuma alteração deve ser feita (pois não pode ser persistida).
Há uma série de retornos de chamada associados à destruição. Se o retorno de chamada before_destroy retornar false, a ação será cancelada e destroy retornará false. Consulte ActiveRecord :: Callbacks para obter mais detalhes.
model#before_destroy
que pode ser usado para interromper adestroy()
chamada final sob certas condições.delete
excluirá apenas o registro de objeto atual do db, mas não os registros filhos associados do db.destroy
excluirá o registro de objeto atual do db e também o registro filho associado do db.Seu uso realmente importa:
Se seus vários objetos pai compartilharem objetos filhos comuns, a chamada
destroy
de um objeto pai específico excluirá objetos filhos que são compartilhados entre outros pais múltiplos.fonte
destroy
é descendente , não filhos : de acordo com a documentação, destroy "cria um novo objeto a partir dos atributos e depois chama destrua nele". rubydoc.info/docs/rails/4.1.7/ActiveRecord%2FRelation:destroyQuando você invoca
destroy
oudestroy_all
em umActiveRecord
objeto, oActiveRecord
processo de 'destruição' é iniciado, ele analisa a classe que você está excluindo, determina o que deve fazer por dependências, executa validações etc.Quando você invoca
delete
oudelete_all
em um objeto,ActiveRecord
apenas tenta executar aDELETE FROM tablename WHERE conditions
consulta no banco de dados, não executando outrasActiveRecord
tarefas de nível superior.fonte
Sim, existe uma grande diferença entre os dois métodos. Use delete_all se desejar que os registros sejam excluídos rapidamente, sem que os retornos de chamada do modelo sejam chamados.
Se você se preocupa com os retornos de chamada dos seus modelos, use destroy_all
Dos documentos oficiais
http://apidock.com/rails/ActiveRecord/Base/destroy_all/class
fonte
Basicamente, "excluir" envia uma consulta diretamente ao banco de dados para excluir o registro. Nesse caso, o Rails não sabe quais atributos estão no registro e está excluindo nem se há retornos de chamada (como
before_destroy
).O método "destroy" pega o ID passado, busca o modelo no banco de dados usando o método "find" e, em seguida, chama destroy nele. Isso significa que os retornos de chamada são acionados.
Você deseja usar "excluir" se não desejar que os retornos de chamada sejam acionados ou se desejar um melhor desempenho. Caso contrário (e na maioria das vezes), você desejará usar "destroy".
fonte
Muitas respostas já; queria pular um pouco mais.
docs :
O
delete
verbage funciona de maneira diferente paraActiveRecord::Association.has_many
eActiveRecord::Base
. No último, a exclusão executaráSQL DELETE
e ignorará todas as validações / retornos de chamada. O primeiro será executado com base na:dependent
opção passada para a associação. No entanto, durante o teste, encontrei o seguinte efeito colateral no qual os retornos de chamada eram executados apenasdelete
e nãodelete_all
dependent: :destroy
Exemplo:fonte