22

User.rb に次のコードを持つ User モデルがあるとします。

before_create :create_dependencies
after_create :build_inbox

また、多数のユーザー フィクスチャが定義された users.yml ファイルもあります。

rake db:fixtures:load を実行すると、コールバックがトリガーされないようです。

  1. これはどのように機能することが期待されていますか?もしそうなら、なぜ彼らはこのように設計したのですか?
  2. フィクスチャをロードするときにコールバックのトリガーを強制する方法はありますか?
4

2 に答える 2

30

これはどのように機能することが期待されていますか?もしそうなら、なぜ彼らはそれをこのように設計したのですか?

はい、フィクスチャはコールバックを使用しません。これはパフォーマンス上の理由によるものだと思います。モデルをインスタンス化せずに、データをデータベースに直接ロードする方が高速です。

フィクスチャをロードするときにコールバックのトリガーを強制する方法はありますか?

私が知っていることではありません。いくつかのオプションがあります。1つは、コールバックがすでにトリガーされているかのようにフィクスチャを構築することです。つまり、コールバックが行うデータを手動で作成します。たとえば、ユーザーのパスワードをハッシュするコールバックがある場合は、パスワードを手動でハッシュしてから、そのハッシュをフィクスチャに保存する必要があります。

2番目の解決策(そして強くお勧めします!)は、ファクトリを使用することです。ファクトリはコールバックをトリガーし、仮想属性などを使用できるようにします。これは、ファクトリが毎回モデルをインスタンス化するためです。人気のある逸品の1つはファクトリーガールです。もう1つ試してみるのは、マシニストです。このトピックに関するRailscastsエピソードも作成しました。

于 2009-08-03T16:07:24.380 に答える
3

私もこの問題を抱えています。私たちのアプリは before_save の前にいくつかの合計を計算するので、その場で実行する必要はありません。レポートを高速化し、特定のレポートでいくつかの結合をカットします。

これらのオブジェクトのテストでは、次のようにコールバックを手動で実行します。

before do
  order.perform_callbacks
end

これは、常に実行されるわけではないため、他のテストが影響を受けないため、うまく機能します。

ところで、ミニテストとフィクスチャを使用しています。

于 2015-04-08T18:17:19.210 に答える