web-dev-qa-db-ja.com

データベーステーブルのすべてのレコードを削除する

RubyアプリのRailsのデータベーステーブルの1つのレコードをすべて削除するにはどうすればよいですか?

121
Justin Meltzer

SQLを使用しない方法を探している場合は、delete_allを使用できます。

Post.delete_all

または基準付き

Post.delete_all "person_id = 5 AND (category = 'Something' OR category = 'Else')"

詳細については、 here を参照してください。

レコードは最初にロードせずに削除されるため、非常に高速になりますが、削除時に実行されるRailsコードに依存するカウンターキャッシュなどの機能が破損します。

232
HakonB

SQL経由で削除するには

Item.delete_all # accepts optional conditions

各モデルのdestroyメソッドを呼び出して削除するには(高価ですが、コールバックが呼び出されるようにします)

Item.destroy_all # accepts optional conditions

すべて ここ

28
lebreeze

データベースに接続されているモデルを削除するだけでなく、データベースを完全に空にする場合は、次の操作を実行できます。

rake db:purge

また、テストデータベースでそれを行うことができます

rake db:test:purge
21
KensoDev

すべてのモデルのすべてのインスタンスを削除することを意味する場合、私は使用します

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)
5
dfaulken
BlogPost.find_each(&:destroy)
4
Philip

すべてのテーブルのすべてのエントリを削除する場合の最新の回答:

def reset
    Rails.application.eager_load!
    ActiveRecord::Base.descendants.each { |c| c.delete_all unless c == ActiveRecord::SchemaMigration  }
end

eager_loadhere の詳細。

呼び出した後、ActiveRecord::Baseのすべての子孫にアクセスし、すべてのモデルにdelete_allを適用できます。

SchemaMigrationテーブルをクリアしないように注意してください。

2
Simon Ninon

モデルがBlogPostの場合、次のようになります。

BlogPost.all.map(&:destroy)
1
stef