Come si elimina un oggetto ActiveRecord?


Risposte:


572

È destroye destroy_allmetodi, come

user.destroy
User.find(15).destroy
User.destroy(15)
User.where(age: 20).destroy_all
User.destroy_all(age: 20)

In alternativa è possibile utilizzare deletee delete_allche non imporranno :before_destroye :after_destroyrichiamate o eventuali opzioni di associazione dipendenti.

User.delete_all(condition: 'value') ti consentirà di eliminare i record senza una chiave primaria

Nota : dal commento di @hammady, user.destroynon funzionerà se il modello utente non ha una chiave primaria.

Nota 2 : Dal commento di @ pavel-chuchuva, destroy_allcon le condizioni e delete_allcon le condizioni è stato deprecato in Rails 5.1 - vedi guide.rubyonrails.org/5_1_release_notes.html


4
Sarebbe bello se potessi includere il commento di @ Hammady nella tua risposta. Ho
lottato


Perché aggiorna solo i dati della colonna delete_at nel mio database? Come posso eliminare l'intera riga di dati?
TommyQu,

1
destroy_all con le condizioni e delete_all con le condizioni è stato deprecato in Rails 5.1 - vedi guide.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva,

questo User.find_by(username:"bob") è un bene per identificare il record di distruggere o eliminare, troppo.
barlop

60

C'è delete, delete_all, destroy, e destroy_all.

I documenti sono: documenti più vecchi e documenti Rails 3.0.0

deletenon crea un'istanza degli oggetti, mentre lo destroyfa. In generale, deleteè più veloce di destroy.


4
deleteè più veloce ma ignora i callback che potresti aver definito sul modello
Rudi,

48
  1. User.destroy

User.destroy(1)eliminerà l'utente con id == 1e :before_destroye si :after_destroyverificano callback. Ad esempio se si hanno record associati

has_many :addresses, :dependent => :destroy

Dopo la distruzione dell'utente verranno distrutti anche i suoi indirizzi. Se si utilizza invece l'azione di eliminazione, i callback non si verificheranno.

  1. User.destroy, User.delete

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

Avviso : l'utente è una classe e l'utente è un oggetto istanza


3
Grazie per aver indirizzato i record associati.
Sage Mitchell,

2
ATTENZIONE: User.destroy_all()esegue i callback, quindi prima di eliminare qualsiasi cosa, carica i record. Sono due istruzioni SQL, non una. A parte le implicazioni sulle prestazioni, anche questo ha implicazioni sulla concorrenza. La chiamata più sicura salta le richiamate; User.delete_all()emetterà un solo DELETE FROM...comando.
Andrew Hodgkinson,

1
destroy_all con condizioni è stato deprecato in Rails 5.1 - vedi guide.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.