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?

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


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


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.