9

あなたはドリルを知っています:いくつかの無効なデータが本番データベースにポップアップし、それを取り除く必要があります。本番サーバーでRailsコンソールを起動し、クエリを入力します。

Foo.where(bar: 'baz').all

返されたデータを確認し、それを削除する必要があります。次に、次のように入力します。

Foo.where(bar: 'baz').destroy_all

そして、あなたの心は一瞬止まります。実行する前にクエリを確認したいだけです。

Railsでそれを行う方法はありますか?似たような方法を探しています

Foo.where(bar: 'baz').to_sql

ただし、DELETEクエリを返すものです。

4

3 に答える 3

2

問題はdestroy_all、単一のSQLクエリを実行しないことです。オブジェクトのハッシュを反復処理してインスタンス化し、コールバックを実行してから、そのオブジェクトのdestroyメソッドを呼び出します。Railsには、これらのクエリの配列を生成する組み込みの方法はありません。

delete_allCdesroisiersは、サンドボックスモードでクエリをテストできることは正しいですが、実際の問題は、対象となるデータを確認したにもかかわらず、実行するかどうかを2番目に推測していることです。

ActiveRecordを信頼してオブジェクトを適切に削除したくない場合は、 PaperTrailのようなActiveRecordバージョン管理ジェムの使用を検討してください。

于 2012-06-07T17:56:45.447 に答える
1

頭のてっぺんから、コンソールをサンドボックスモードで実行し、削除クエリを実行してSQLを確認できます。変更は、終了時にロールバックされるだけです。

于 2012-06-07T17:38:42.863 に答える
1

destroy_allメソッドは、次のようにするのと同じです。

Foo.where(bar: 'baz').each { |object| object.destroy }

したがって、SQLは次のようになります

DELETE FROM foo WHERE foo.id = your_objects_id_attribute



ドキュメントから:

  def destroy_all(conditions = nil)
    find(:all, :conditions => conditions).each { |object| object.destroy }
  end
于 2012-06-07T19:00:22.637 に答える