Como você exclui um objeto ActiveRecord?

328

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.

  1. Excluir por id,

  2. Excluir o objeto atual como: user.remove,

  3. Você pode excluir com base em uma wherecláusula?

Blankman
fonte

Respostas:

572

É destroye destroy_allmé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 deletee delete_allque não aplicará :before_destroye :after_destroyretornos 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.destroynã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_allcondições e delete_allcondições foram descontinuadas no Rails 5.1 - veja guias.rubyonrails.org/5_1_release_notes.html

Marek Sapota
fonte
4
Seria bom se você pudesse incluir o comentário de @ hammady em sua resposta. Lutado para descobrir por que eu não poderia destruir o meu modelo de objeto ...
the_critic
Por que ele atualiza apenas os dados da coluna delete_at no meu banco de dados? Como posso excluir toda a linha de dados?
TommyQu
1
destroy_all with conditions e delete_all with conditions foi descontinuado no Rails 5.1 - consulte guias.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva
isso User.find_by(username:"bob") é bom para identificar o registro para destruir ou excluir também.
barlop
60

delete, delete_all, destroy, e destroy_all.

Os documentos são: documentos antigos e documentos do Rails 3.0.0

deletenão instancia os objetos, enquanto destroyfaz. Em geral, deleteé mais rápido que destroy.

falta de polaridade
fonte
4
deleteé mais rápido, mas ignora as chamadas de retorno que você pode ter definidos no modelo
Rudi
48
  1. User.destroy

User.destroy(1)excluirá o usuário com id == 1e :before_destroye :after_destroyretornos de chamada. Por exemplo, se você possui registros associados

has_many :addresses, :dependent => :destroy

Depois 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.

  1. User.destroy, User.delete

  2. User.destroy_all(<conditions>) ou User.delete_all(<conditions>)

Aviso : Usuário é uma classe e usuário é um objeto de instância

Tadas T
fonte
3
Obrigado por abordar os registros associados.
Sábio Mitchell
2
CUIDADO: 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 único DELETE FROM...comando.
Andrew Hodgkinson
1
destroy_all with conditions foi descontinuado no Rails 5.1 - veja guias.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva