Come si elimina un oggetto ActiveRecord?
Ho esaminato Active Record Querying e non ha nulla sull'eliminazione che posso vedere.
Elimina per
id
,Eliminare l'oggetto corrente come:
user.remove
,Puoi eliminare in base a una
where
clausola?
Come si elimina un oggetto ActiveRecord?
Ho esaminato Active Record Querying e non ha nulla sull'eliminazione che posso vedere.
Elimina per id
,
Eliminare l'oggetto corrente come: user.remove
,
Puoi eliminare in base a una where
clausola?
Risposte:
È destroy
e destroy_all
metodi, 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 delete
e delete_all
che non imporranno :before_destroy
e :after_destroy
richiamate 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.destroy
non funzionerà se il modello utente non ha una chiave primaria.
Nota 2 : Dal commento di @ pavel-chuchuva, 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
User.find_by(username:"bob")
è un bene per identificare il record di distruggere o eliminare, troppo.
C'è delete
, delete_all
, destroy
, e destroy_all
.
I documenti sono: documenti più vecchi e documenti Rails 3.0.0
delete
non crea un'istanza degli oggetti, mentre lo destroy
fa. In generale, delete
è più veloce di destroy
.
delete
è più veloce ma ignora i callback che potresti aver definito sul modello
User.destroy
User.destroy(1)
eliminerà l'utente con id == 1
e :before_destroy
e si :after_destroy
verificano 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.
User.destroy
, User.delete
User.destroy_all(<conditions>)
o User.delete_all(<conditions>)
Avviso : l'utente è una classe e l'utente è un oggetto istanza
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.