Come posso eliminare tutti i record in una delle mie tabelle del database in un'app Ruby on Rails?
Come posso eliminare tutti i record in una delle mie tabelle del database in un'app Ruby on Rails?
Risposte:
Se stai cercando un modo per farlo senza SQL, dovresti essere in grado di utilizzare delete_all.
Post.delete_all
o con un criterio
Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"
Vedi qui per maggiori informazioni.
I record vengono eliminati senza caricarli prima, il che lo rende molto veloce ma interromperà la funzionalità come la cache del contatore che dipende dal codice dei binari da eseguire al momento dell'eliminazione.
ActiveRecord
modelli. La domanda si pone sull'eliminazione di record da una 'tabella' e sto solo indicando o il presupposto contenuto nella risposta.
Se intendi cancellare ogni istanza di tutti i modelli, userei
ActiveRecord::Base.connection.tables.map(&:classify)
.map{|name| name.constantize if Object.const_defined?(name)}
.compact.each(&:delete_all)
select
ogni volta che devi usare un'espressione if all'interno di un blocco, in questo modo eviti di dover concatenare il metodo compatto per rimuovere elementi nulli.
BlogPost.find_each(&:destroy)
Se il tuo modello si chiama BlogPost, sarebbe:
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)
Risposta più recente nel caso in cui si desideri eliminare tutte le voci in ogni tabella:
def reset
Rails.application.eager_load!
ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration }
end
Maggiori informazioni sul eager_load
qui .
Dopo averlo chiamato, possiamo accedere a tutti i discendenti di ActiveRecord::Base
e possiamo applicare un delete_all
su tutti i modelli.
Si noti che ci assicuriamo di non cancellare la tabella SchemaMigration.