Як видалити всі записи в одній із моїх таблиць бази даних в додатку Ruby on Rails?
Як видалити всі записи в одній із моїх таблиць бази даних в додатку Ruby on Rails?
Відповіді:
Якщо ви шукаєте шлях до нього без SQL, ви повинні мати можливість delete_all.
Post.delete_all
або з критеріями
Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"
Дивіться тут для отримання додаткової інформації.
Записи видаляються, не завантажуючи їх спочатку, що робить це дуже швидко, але порушує функціональність, як кеш-лічильник, який залежить від коду рейлів, який буде виконуватися після видалення.
ActiveRecord
моделями. Питання задає питання про видалення запису з "таблиці", і я просто вказую на припущення, яке міститься у відповіді.
Якщо ви маєте на увазі видалити кожен екземпляр усіх моделей, я б використав
ActiveRecord::Base.connection.tables.map(&:classify)
.map{|name| name.constantize if Object.const_defined?(name)}
.compact.each(&:delete_all)
select
будь-коли, коли вам потрібно використовувати вираз if всередині блоку, таким чином вам не доведеться ланцюжок компактного методу для видалення нульових елементів.
BlogPost.find_each(&:destroy)
Якщо ваша модель називається BlogPost, це буде:
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)
Більш свіжа відповідь у випадку, коли ви хочете видалити всі записи у всіх таблицях:
def reset
Rails.application.eager_load!
ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration }
end
Більше інформації eager_load
тут .
Після його виклику ми можемо отримати доступ до всіх нащадків ActiveRecord::Base
і можемо застосувати атрибути delete_all
на всіх моделях.
Зауважте, що ми не перечищаємо таблицю міграції SchemaMigra.