6

Rails 2.3.2 では ActiveRecord クエリがキャッシュされることを知っています。つまり、開発/運用ログに何かが表示される場合があります。

CACHE (0.0ms)   SELECT * FROM `users` WHERE `users`.`id` = 1

同じ原則がレーキタスクにも当てはまるかどうか疑問に思っていました。

多くの異なるモデルをクエリする rake タスクがあり、独自のキャッシングを実装する必要があるかどうか、またはこの動作がデフォルトで含まれているかどうかを知りたいです。

また、rake タスク中に実行される SQL クエリを確認する方法はありますか? 開発・運用ログと同様

4

3 に答える 3

3

rake タスクのデフォルトでは、SQL キャッシュは有効になっていません。次のように、コードをキャッシュ ブロックにラップできます。

task :foobar => :environment do
  ActiveRecord::Base.connection.cache do
    User.find 1 # Will hit the db
    User.find 1 # Will hit the cache
  end
end

これは基本的に Rails がコントローラーのアクションに対して行うことです。キャッシュはメモリを使用し、rake タスクは大量のデータ セットを処理する傾向があるため、問題が発生する可能性があることに注意してください。を使用して、コードの一部のキャッシュを選択的にオプトアウトできます。uncached

于 2014-12-16T14:46:55.077 に答える
2

あなたはActiveRecordクエリキャッシングについて話している。キャッシュが有効になっている環境で実行している場合、Rake-Tasks でも機能するはずですproduction例については、キャッシングに関する Rails ガイドを参照してください。

ケースに適した種類のキャッシュである場合とそうでない場合があります。

u1=User.find 1  # loads user1 first time from DB
u2=User.find 2  # loads user2 first time from DB
u1again = User.find 1 # loads user1 from cache
all = User.all # loads user1 and user2 from DB again
于 2009-07-09T12:11:56.903 に答える
1

rake タスクは、指定した環境で実行されます。この場合、その環境のルールが採用されます。

コマンド ラインから rails env を設定できます。

RAILS_ENV=test

ロギングは rake の一部として設定でき、これは通常の Rails ログに表示されます。

于 2009-05-19T00:50:39.287 に答える