Wie lösche ich alle Datensätze in einer meiner Datenbanktabellen in einer Ruby on Rails-App?
Wie lösche ich alle Datensätze in einer meiner Datenbanktabellen in einer Ruby on Rails-App?
Antworten:
Wenn Sie nach einem Weg ohne SQL suchen, sollten Sie delete_all verwenden können.
Post.delete_all
oder mit einem Kriterium
Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"
Sehen Sie hier für weitere Informationen.
Die Datensätze werden gelöscht, ohne sie zuerst zu laden. Dies macht sie sehr schnell, unterbricht jedoch Funktionen wie den Zähler-Cache, der vom Rails-Code abhängt, der beim Löschen ausgeführt werden soll.
ActiveRecord
Modelle sind. Die Frage fragt nach dem Löschen eines Datensatzes aus einer 'Tabelle' und ich zeige nur oder die Annahme, die in der Antwort enthalten ist.
Wenn Sie damit meinen, jede Instanz aller Modelle zu löschen, würde ich verwenden
ActiveRecord::Base.connection.tables.map(&:classify)
.map{|name| name.constantize if Object.const_defined?(name)}
.compact.each(&:delete_all)
select
Sie immer dann, wenn Sie einen if-Ausdruck innerhalb eines Blocks verwenden müssen. Auf diese Weise müssen Sie die kompakte Methode nicht verketten, um keine Elemente zu entfernen.
BlogPost.find_each(&:destroy)
Wenn Ihr Modell BlogPost heißt, wäre es:
BlogPost.all.map(&:destroy)
MOPED: 127.0.0.1:27017 QUERY database=a_database collection=nothings selector={} flags=[:slave_ok] limit=0 skip=0 batch_size=nil fields=nil (0.3378ms)
Neuere Antwort für den Fall, dass Sie alle Einträge in jeder Tabelle löschen möchten:
def reset
Rails.application.eager_load!
ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration }
end
Weitere Informationen dazu eager_load
hier .
Nach dem Aufruf können wir auf alle Nachkommen von zugreifen ActiveRecord::Base
und ein delete_all
auf alle Modelle anwenden .
Beachten Sie, dass wir sicherstellen, dass die SchemaMigration-Tabelle nicht gelöscht wird.