Подтвердить что ты не робот

Усекать стол с помощью консоли рельсов

У меня есть эта база данных тестирования, которая к настоящему времени заполнена барахлом. Теперь я сделал несколько команд Table.destroy_all в консоли rails, которая удаляет все записи и зависимости, которые являются удивительными. Однако; Я хотел бы усечь все, чтобы идентификатор и т.д. Снова начинался с 1. Есть ли способ в Rails 3?

4b9b3361

Ответ 1

Принятый ответ работает только в том случае, если вам нужно воссоздать всю базу данных.
Чтобы удалить отдельную таблицу (с обратными вызовами) и получить идентификаторы для начала с 1:

Model.destroy_all # Only necessary if you want to trigger callbacks.
ActiveRecord::Base.connection.execute("TRUNCATE #{table_name} RESTART IDENTITY")

Если вы используете Sqlite, он не поддерживает усечение, поэтому выполните следующие действия:

Model.destroy_all # Only necessary if you want to trigger callbacks.
ActiveRecord::Base.connection.execute("Delete from #{table_name}")
ActiveRecord::Base.connection.execute("DELETE FROM SQLITE_SEQUENCE WHERE name='#{table_name}'")

Ответ 2

Просто перестройте базу данных в следующем тестовом прогоне (это произойдет автоматически после ее удаления).

rake db:drop RAILS_ENV=test

Ответ 3

Вы также можете сделать rake db:rollback STEP=3 RAILS_ENV=test

где 3 - количество миграций, которое у вас есть в db/migrate. В примере: Если у меня есть

db/migrate
20140121065542_create_users.rb
20140121065710_create_profiles.rb
20140121065757_create_articles.rb
20140121065900_create_comments.rb
20140121065929_create_categories.rb

Итак, у меня есть всего 5 миграций для удаления. Если я сделаю rake db:rollback STEP=5 RAILS_ENV=test, все таблицы будут удалены из моей базы данных TEST, и если я удалю RAILS_ENV = test, то все таблицы ENVIRONNMENT (production, test, development) будут удалены, и он очистит также файл db/shema.rb от него данные миграции.

Ответ 4

rake db:reset выполнит rake db:drop db:setup. Другими словами, удалите базу данных и настройте базу данных еще раз.

Источник

Ответ 5

Это сработало для меня → >   ActiveRecord:: Base.connection.execute( "TRUNCATE table_name" )

Ответ 6

Предполагая, что вы используете MySQL или Postgre, а не SQlite3 (который не поддерживает TRUNCATE), вы можете сделать следующее:

MyModel.connection_pool.with_connection { |c| c.truncate(MyModel.table_name) }

Обратите внимание, что это не вызовет обратные вызовы ActiveRecord.

Ответ 7

(Я немного опоздал на вечеринку)

Просить сделать это в консоли:

2.1.2 :001 > Post.all.each do |post|
2.1.2 :002 >   post.destroy!
2.1.2 :003 > end

Работает также...

Это по существу проходит через все сообщения и уничтожает их. Он не меняет ваше значение автоматического увеличения, хотя...

Такая же логика должна работать и для Rails 3 (хотя я использую Rails 4)