如何在Ruby on Rails 3中缓存查询

时间:2011-04-18 22:53:49

标签: ruby-on-rails-3 caching activerecord

我的应用程序中有以下查询

@categories = Category.joins(:posts).select('distinct categories.*').order('label')

此查询会在每个页面视图上加载,因为类别显示在每个页面上。这对我来说似乎很混乱,因为类别列表经常没有得到更新。是否有一种很好的方法来缓存查询?我试过了

   Category.cache do
      @categories = Category.joins(:posts).select('distinct categories.*').order('label')
    end

但我仍然看到每次从开发日志中的数据库加载查询。

2 个答案:

答案 0 :(得分:19)

在您的控制器中,您可以尝试以下内容:

@categories = Rails.cache.fetch('categories', :expires_in => 24.hours) { Category.joins(:posts).select('distinct categories.*').order('label') }

只会读取以下数据块“类别”是否已缓存且未过期。如果在24小时后过期,则将查询模型并将新记录写入Rails缓存。

有关详细信息,请按照以下guide进行操作。

试一试。我这样工作。希望有所帮助。

答案 1 :(得分:4)

您可以对显示类别的视图模板部分使用片段缓存。这意味着类别将从缓存存储中提供,并且查询将只执行一次,直到缓存过期(通过使用expire_fragment方法)。