56

私はこのテストデータベースを持っていますが、今ではジャンクでいっぱいです。RailsコンソールでTable.destroy_allコマンドをいくつか実行して、すべてのレコードと依存関係を削除しました。これは素晴らしいことです。でも; ID などが 1 から始まるように、すべてを切り詰めたいと思います。Rails 3に何か方法はありますか?

4

11 に答える 11

152

受け入れられた回答は、データベース全体を再作成する必要がある場合にのみ機能します。
1 つのテーブル (コールバックを含む) を削除し、ID を 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}'")
于 2012-11-01T09:16:16.173 に答える
17

これは私のために働いた - ActiveRecord::Base.connection.execute("TRUNCATE table_name")

于 2015-02-13T14:25:51.480 に答える
2

あなたもできる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=testTEST データベースから削除され、RAILS_ENV=test を削除すると、すべての ENVIRONNMENT (運用、テスト、開発) テーブルが削除され、移行データから db/shema.rb ファイルも削除されます。

于 2014-01-21T08:36:31.073 に答える
2

次回のテスト実行時にデータベースを再構築するだけです (これは、削除後に自動的に行われます)。

rake db:drop RAILS_ENV=test

于 2012-11-01T08:44:49.623 に答える
0

以下のコードを使用して、すべてのテーブルを切り捨てました

ActiveRecord::Base.establish_connection
ActiveRecord::Base.connection.tables.each do |table|
  next if table == 'schema_migrations'

  case ActiveRecord::Base.connection.adapter_name.downcase.to_sym
    when :mysql2 , :postgresql
      ActiveRecord::Base.connection.execute("TRUNCATE #{table}")
      ActiveRecord::Base.connection.execute("TRUNCATE #{table} RESTART IDENTITY")
    when :sqlite
      ActiveRecord::Base.connection.execute("DELETE FROM #{table}")
  end
end
于 2020-06-12T05:25:21.950 に答える
-5

(パーティーに少し遅れました、私は知っています)

コンソールでこれを行うように依頼する:

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

同様に動作します...

これは基本的にすべての投稿をループして破棄します。ただし、自動インクリメント値は変更されません...

Rails 3でも同じロジックが機能するはずです(Rails 4を使用していますが)

于 2014-08-17T00:48:24.377 に答える