2009-05-19 5 views
5

私はあなたが開発/生産ログに何かを見ることができる、すなわち、レールに2.3.2のActiveRecordクエリがキャッシュされていることを知っている:同じ原理がタスクを熊手するために適用した場合、私は思っていたレーキタスクにキャッシュされたActiveRecordモデル?

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

を。

私は多くの異なるモデルをクエリするレーキタスクを持っています。自分のキャッシュを実装する必要があるかどうか、またはこの動作がデフォルトで含まれているかどうかを知りたいと思います。

また、レーキタスク中に実行されるSQLクエリを確認する方法はありますか?開発/生産ログと同様

答えて

1

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

あなたは、コマンドラインからレールのenvを設定することができます。

RAILS_ENV=test 

ロギングは熊手の一部として設定することができ、あなたの通常のRailsのログにこれを見る必要があります。

2

あなたはActiveRecordクエリキャッシュについて話しています。キャッシングが有効になっている環境で実行している場合、Rake-Tasksでも動作します。 production。 例については、Rails Guide on Cachingを参照してください。

それはあるいはあなたのケースのためのキャッシングの右の一種であってもなくてもよい。

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 
+0

私はコントローラでのみ真実かもしれないと思います。クエリのキャッシュは、アクションの開始時に作成され、そのアクションの終わりに破棄されるため、アクションの持続時間中のみ持続することに注意することが重要です。 環境ログ(上記の回答を取る場合はlog/test.log)を見ると、繰り返されるSQLクエリが表示されます。 – chug2k

1

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は、コントローラのアクションのために何をするか、本質的です。キャッシュはメモリを使用し、レーキタスクは大きなデータセットで動作する傾向があり、問題が発生する可能性があります。 uncached

関連する問題