【问题标题】:ActiveRecord models cached in rake tasks?缓存在 rake 任务中的 ActiveRecord 模型?
【发布时间】:2010-10-27 04:47:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails activerecord rake


    【解决方案1】:

    默认情况下,不会为 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】:

      您正在谈论 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
      

      【讨论】:

      • 我认为这可能只适用于控制器。这里有文字:“重要的是要注意,查询缓存是在动作开始时创建的,并在动作结束时销毁,因此仅在动作期间持续存在。”您应该查看您的环境日志(即 log/test.log,如果您接受上述答案),您会看到重复的 SQL 查询。
      【解决方案3】:

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

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

      RAILS_ENV=test
      

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

      【讨论】:

        猜你喜欢
        • 2011-03-23
        • 2012-12-19
        • 1970-01-01
        • 1970-01-01
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        相关资源
        最近更新 更多