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


回答:


249

SQLを使わずにその方法を探している場合は、delete_allを使用できるはずです。

Post.delete_all

または基準付き

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

詳細については、こちらをご覧ください。

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


13
:dependent =>:destroy、または削除時にクリーンアップする必要があるものとの関連付けがある場合は、おそらくPost.destroy_allが必要になりますが、速度ははるかに遅くなります。apidock.com/rails/ActiveRecord/Base/destroy_all/classを
Michael Hellein

この回答は、テーブルにモデルが関連付けられていることを前提としています。OPはこれを指定しませんでした-テーブルが結合テーブルの場合はどうなりますか?
Toby 1 Kenobi

1
@BradWerthは、スタイルが良いか悪いかによって、RailsデータベースにActiveRecordモデルではないテーブルがある可能性があると言っています。質問は「テーブル」からレコードを削除することについて尋ねます、そして私はちょうど指しているか、答えに保持されている仮定です。
Toby 1 Kenobi、2015

@ Toby1Kenobiと同じクエリがあります。
nbsamar

30

SQL経由で削除するには

Item.delete_all # accepts optional conditions

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

Item.destroy_all # accepts optional conditions

すべてここに


21

データベースを完全に空にして、それに接続されているモデルを削除するだけではない場合は、次のようにすることができます。

rake db:purge

テストデータベースでも実行できます

rake db:test:purge

5

すべてのモデルのすべてのインスタンスを削除するつもりなら、私は

ActiveRecord::Base.connection.tables.map(&:classify)
  .map{|name| name.constantize if Object.const_defined?(name)}
  .compact.each(&:delete_all)

1
好むselectあなたはブロック内のif式を使用する必要がある時はいつでも、この方法は、あなたがnilの要素を削除するために、コンパクトなメソッドチェーンを有する避けます。
セバスチャンパルマ

4
BlogPost.find_each(&:destroy)

これは、メモリが少ない状況に最適です。
エピジェネ

これは、メモリ消費を考慮に入れる唯一の回答です。
John

2
ああ、なぜこのためにループを作るのか...意味がありません。すべてのレコードを削除するだけです。DELETEFROM table、Model.delete_all
Imnl

@ジョン、単一のクエリがクエリのループよりも多くのメモリを消費するのはなぜですか?
Imnl 2017年

@Imnl各反復は、問題のモデルの新しいインスタンスをインスタンス化して、deleteメソッドのコールバックを処理できるようにします。
John

2

モデルがBlogPostと呼ばれる場合、次のようになります。

BlogPost.all.map(&:destroy)

これにより、すべてのBlogPostがフェッチされ、破棄する前にRuby配列にロードされます。
hdgarrood 2013年

ORMに依存します。各モデルについて何も要求しないため、Datamapperはそれを行いません。:そして、ここでMongoidのスタックトレースは、それが各エントリを破壊する前にすべてのフィールドを選択していない番組ということだ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)
ステフ

4
これはRailsの質問であり、質問者は彼が使用しているORMを言っていないため、ActiveRecordを想定する必要があります
hdgarrood

2

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

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すべてのモデルにを適用できます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.