2009-05-19 62 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