在rake任务中缓存的ActiveRecord模型?

时间:2009-05-19 00:46:07

标签: ruby-on-rails activerecord rake

我知道在rails 2.3.2中缓存了ActiveRecord查询,即您可能会在开发/生产日志中看到一些内容:

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

我想知道相同的原则是否适用于rake任务。

我有一个rake任务会查询很多不同的模型,我想知道我是否应该实现自己的缓存,或者默认情况下是否包含此行为。

另外,有没有办法查看在rake任务期间执行的sql查询?与开发/生产日志类似

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

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

有选择地选择停用部分代码的缓存

答案 2 :(得分:1)

rake任务将在您指定的环境中运行,在这种情况下,它将采用该环境的规则。

您可以从命令行设置rails env:

RAILS_ENV=test

日志记录可以设置为rake的一部分,您应该在普通的Rails日志中看到这一点。