Jak usunąć wszystkie rekordy w jednej z moich tabel bazy danych w aplikacji Ruby on Rails?
Jak usunąć wszystkie rekordy w jednej z moich tabel bazy danych w aplikacji Ruby on Rails?
Odpowiedzi:
Jeśli szukasz sposobu na to bez SQL, powinieneś być w stanie użyć delete_all.
Post.delete_all
lub z kryteriami
Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"
Więcej informacji znajdziesz tutaj .
Rekordy są usuwane bez ich wcześniejszego ładowania, co czyni je bardzo szybkimi, ale psuje funkcjonalność, taką jak pamięć podręczna liczników, która zależy od kodu szyn, który ma być wykonany po usunięciu.
ActiveRecord
modelami. Pytanie dotyczy usunięcia rekordu z „tabeli”, a ja tylko wskazuję lub założenie zawarte w odpowiedzi.
Jeśli masz na myśli usunięcie każdej instancji wszystkich modeli, użyłbym
ActiveRecord::Base.connection.tables.map(&:classify)
.map{|name| name.constantize if Object.const_defined?(name)}
.compact.each(&:delete_all)
select
gdy potrzebujesz użyć wyrażenia if wewnątrz bloku, w ten sposób unikniesz konieczności łączenia w łańcuch metody kompaktowej w celu usunięcia elementów zerowych.
BlogPost.find_each(&:destroy)
Jeśli Twój model nazywa się BlogPost, wyglądałoby to tak:
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)
Nowsza odpowiedź w przypadku, gdy chcesz usunąć wszystkie wpisy we wszystkich tabelach:
def reset
Rails.application.eager_load!
ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration }
end
Więcej informacji na temat eager_load
tutaj .
Po jej wywołaniu możemy uzyskać dostęp do wszystkich potomków ActiveRecord::Base
i możemy zastosować a delete_all
na wszystkich modelach.
Pamiętaj, że nie usuwamy tabeli SchemaMigration.