Como você exclui um objeto ActiveRecord?
Eu olhei para o Active Record Querying e ele não tem nada a excluir que eu possa ver.
Excluir por
id
,Excluir o objeto atual como:
user.remove
,Você pode excluir com base em uma
where
cláusula?
fonte
Como você exclui um objeto ActiveRecord?
Eu olhei para o Active Record Querying e ele não tem nada a excluir que eu possa ver.
Excluir por id
,
Excluir o objeto atual como: user.remove
,
Você pode excluir com base em uma where
cláusula?
É destroy
e destroy_all
métodos, como
user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)
Como alternativa, você pode usar delete
e delete_all
que não aplicará :before_destroy
e :after_destroy
retornos de chamada ou qualquer opção de associação dependente.
User.delete_all(condition: 'value')
permitirá excluir registros sem uma chave primária
Nota : do comentário de @ hammady, user.destroy
não funcionará se o modelo do usuário não tiver uma chave primária.
Nota 2 : a partir do comentário de @ pavel-chuchuva, as destroy_all
condições e delete_all
condições foram descontinuadas no Rails 5.1 - veja guias.rubyonrails.org/5_1_release_notes.html
User.find_by(username:"bob")
é bom para identificar o registro para destruir ou excluir também.Há
delete
,delete_all
,destroy
, edestroy_all
.Os documentos são: documentos antigos e documentos do Rails 3.0.0
delete
não instancia os objetos, enquantodestroy
faz. Em geral,delete
é mais rápido quedestroy
.fonte
delete
é mais rápido, mas ignora as chamadas de retorno que você pode ter definidos no modeloUser.destroy
User.destroy(1)
excluirá o usuário comid == 1
e:before_destroy
e:after_destroy
retornos de chamada. Por exemplo, se você possui registros associadosDepois que o usuário é destruído, seus endereços também serão destruídos. Se você usar a ação de exclusão, os retornos de chamada não ocorrerão.
User.destroy
,User.delete
User.destroy_all(<conditions>)
ouUser.delete_all(<conditions>)
Aviso : Usuário é uma classe e usuário é um objeto de instância
fonte
User.destroy_all()
executa retornos de chamada; portanto, antes de excluir qualquer coisa, carrega registros. São duas instruções SQL e não uma. Além das implicações de desempenho, isso também tem implicações de simultaneidade. A chamada mais segura ignora retornos de chamada;User.delete_all()
emitirá apenas um únicoDELETE FROM...
comando.