4

次のキュウリステップを持つプロジェクトに取り組んでいます:

Given /^no registered users$/ do
  User.delete_all
end

Userテーブルに実際のデータがあるため、開発データベースでテストしていても、新しい RoR ユーザーとしては少し危険に見えます。コード行は何をしていますか?

ありがとう!

4

4 に答える 4

8

delete_all は、FactoryGirl からではなく、activerecord ライブラリからのものです。

そして、これら2つの違いは次のとおりです。

delete_all(条件 = nil)パブリック

  • 最初にレコードをインスタンス化せずに、条件に一致するレコードを削除します。したがって、destroy メソッドを呼び出したり、コールバックを呼び出したりしません。
  • これは、データベースに直接送信される単一の SQL DELETE ステートメントであり、destroy_all よりもはるかに効率的です。
  • ただし、関係には注意してください。特に、関連付けで定義された :dependent ルールは尊重されません。
  • 影響を受けた行数を返します。

destroy_all (条件 = nil)パブリック

  • 各レコードをインスタンス化し、その destroy メソッドを呼び出すことによって、条件に一致するレコードを破棄します。
  • 各オブジェクトのコールバックが実行されます (:dependent 関連オプションと before_destroy/after_destroy Observer メソッドを含む)。
  • 破棄されたオブジェクトのコレクションを返します。変更を加えてはならないことを反映するために、それぞれが凍結されます (永続化できないため)。

ノート

一度に多数のレコードを削除する場合、各レコードのインスタンス化、コールバックの実行、および削除に時間がかかることがあります。レコードごとに少なくとも 1 つの SQL DELETE クエリを生成します。関連付けやコールバックを気にせずに多数の行をすばやく削除したい場合は、代わりに delete_all を使用してください。

于 2012-05-15T13:10:23.830 に答える
2

delete_allFactoryGirl からのものではなく、アクティブな記録コマンドであり、データベースからユーザーを削除します。これをキュウリから実行している場合は、開発ではなく、テスト データベースに対して実行する必要があります。

destroy_allそのバージョンは関連するコールバックを実行するので、より良い代替手段です。たとえば、ユーザーに投稿があり、before_destroyユーザーが削除された場合に投稿を削除するためのコールバックがあるとします。

についての詳細情報へのリンクは次のとおりです。delete_all

于 2012-05-15T04:17:48.890 に答える
1

delete_allRailsコールバックをアクティブにすることなく、対応するテーブルからレコードを強制的に削除します。

destroy_allレコードを削除しますが、モデルのコールバックも呼び出します

于 2012-05-15T13:00:11.737 に答える
0

あなたの例に基づいて、次のCucumberステップで新しいユーザーを登録できるようにするために、おそらくすべてのユーザーを削除しています。ActiveRecord::Base#delete_all メソッドは、部分的に次のように述べています。

最初にレコードをインスタンス化せずに、条件に一致するレコードを削除します。したがって、destroy メソッドを呼び出したり、コールバックを呼び出したりしません。これは、データベースに直接送信される単一の SQL DELETE ステートメントであり、destroy_all よりもはるかに効率的です。

そのテストを作成するためのより良い方法はおそらくありますが、その意図は明らかにユーザー レコードを可能な限り効率的に削除することです。

危険であることについては、テストは、開発または運用データベースではなく、テスト データベースに対して実行する必要があります。Rails.env.test?間違ったデータベースを使用するようにテスト フレームワークを誤って構成する可能性があるため、 trueかどうかをテストするステップまたは条件を追加できます。心の安らぎを得るには、かなり小さな代償です。

于 2012-05-15T04:33:38.090 に答える