Wie lösche ich ein ActiveRecord-Objekt?

328

Wie lösche ich ein ActiveRecord-Objekt?

Ich habe mir Active Record Querying angesehen und es gibt nichts zum Löschen, was ich sehen kann.

  1. Löschen von id,

  2. Löschen Sie das aktuelle Objekt wie: user.remove,

  3. Können Sie basierend auf einer whereKlausel löschen ?

Blankman
quelle

Antworten:

572

Es ist destroyund destroy_allMethoden, wie

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

Alternativ können Sie verwenden deleteund delete_allwelche nicht erzwingen :before_destroyund :after_destroyRückrufe oder alle abhängigen Assoziation Optionen.

User.delete_all(condition: 'value') Mit dieser Option können Sie Datensätze ohne Primärschlüssel löschen

Hinweis : Aus dem Kommentar von @ hammady user.destroygeht nicht hervor, wenn das Benutzermodell keinen Primärschlüssel hat.

Anmerkung 2 : Aus dem Kommentar von @ pavel-chuchuva zu destroy_allBedingungen und delete_allBedingungen wurde in Rails 5.1 verworfen - siehe guide.rubyonrails.org/5_1_release_notes.html

Marek Sapota
quelle
4
Es wäre schön, wenn Sie @ hammadys Kommentar in Ihre Antwort aufnehmen könnten. Ich
kämpfte
Warum werden nur gelöschte_at-Spaltendaten in meiner Datenbank aktualisiert? Wie kann ich die gesamte Datenzeile löschen?
TommyQu
1
destroy_all mit Bedingungen und delete_all mit Bedingungen sind in Rails 5.1 veraltet - sieheguides.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva
Dies User.find_by(username:"bob") ist gut, um den Datensatz zu identifizieren, der ebenfalls zerstört oder gelöscht werden soll.
Barlop
60

Es gibt delete , delete_all, destroy, und destroy_all.

Die Dokumente sind: ältere Dokumente und Rails 3.0.0-Dokumente

deleteinstanziiert die Objekte nicht, während dies der destroyFall ist. Im Allgemeinen deleteist schneller als destroy.

Unpolarität
quelle
4
deleteist schneller, umgeht aber die Rückrufe, die Sie möglicherweise auf dem Modell definiert haben
Rudi
48
  1. User.destroy

User.destroy(1)löscht Benutzer mit id == 1und :before_destroyund :after_destroyRückrufe treten auf. Zum Beispiel, wenn Sie Datensätze zugeordnet haben

has_many :addresses, :dependent => :destroy

Nachdem der Benutzer zerstört wurde, werden auch seine Adressen zerstört. Wenn Sie stattdessen die Löschaktion verwenden, werden keine Rückrufe ausgeführt.

  1. User.destroy, User.delete

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

Hinweis : Benutzer ist eine Klasse und Benutzer ist ein Instanzobjekt

Tadas T.
quelle
3
Vielen Dank für die Adressierung der zugehörigen Datensätze.
Sage Mitchell
2
ACHTUNG: Führt User.destroy_all()Rückrufe aus. Bevor also etwas gelöscht wird , werden Datensätze geladen . Es sind zwei SQL-Anweisungen, keine. Abgesehen von den Auswirkungen auf die Leistung hat dies auch Auswirkungen auf die Parallelität. Der sicherere Anruf überspringt Rückrufe. User.delete_all()gibt nur einen einzigen DELETE FROM...Befehl aus.
Andrew Hodgkinson
1
destroy_all mit Bedingungen ist in Rails 5.1 veraltet - sieheguides.rubyonrails.org/5_1_release_notes.html
Pavel Chuchuva