2009-05-19 160 views
5

我知道,在軌的ActiveRecord 2.3.2查詢緩存,即你可能會看到一些在開發/生產日誌:緩存在rake任務中的ActiveRecord模型?

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

我在想,如果同樣的原則也適用於耙任務。

我有一個rake任務,將查詢很多不同的模型,並且我想知道是否應該實現自己的緩存,或者如果此行爲是默認包含的。

此外,有沒有辦法看到耙子任務期間執行的SQL查詢?與開發/生產日誌類似

回答

1

rake任務將在您指定的環境中運行,在這種情況下,它將採用該環境的規則。

您可以通過命令行設置護欄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 2013-06-20 19:57:06

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爲控制器操作所做的工作。請注意,緩存使用內存和rake任務傾向於處理大量數據,這可能會給您帶來問題。你可以選擇退出部分代碼的緩存,使用uncached