Wie lösche ich ein ActiveRecord-Objekt?


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


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.


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


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.