碎片& Rails 4中的ActiveRecord或SQL缓存工作?

时间:2014-02-05 22:46:26

标签: ruby-on-rails ruby caching

好吧,我在工作中有一个基本的CMS&我想尝试缓存基本上是一组动态生成的导航链接。在我的pages_controller中,我有以下操作来切换页面的可见性,以及根据可见的页面创建@nav_links变量的查询

before_filter :nav_links, only: [:index, :new, :show, :edit]

def toggle
  @visibility = @page.visible? ? false : true
  unless @page.update_attribute(:visible, @visibility)
    flash[:alert] = "Uh oh! Looks like something went wrong."
  end
  expire_fragment "nav"
end

def nav_links
  @nav_links = {}
  groups = PageGroup.order("id")
  groups.each do |group|
    if group.visible?
      @nav_links[group.name.to_sym] = group.pages.where(visible: true)
    end
  end
end

在我看来,我已将与@nav_links相关的页面部分与<% cache "nav" do %>...<% end %>包装在一起。所以我的问题是,在调用其中一个动作时会发生什么?

  1. Rails是否仍然执行before_filter,查询数据库,&amp;每次访问重新填充@nav_links哈希?或者只有在视图无法在缓存中找到@nav_links的副本时才会调用它?如果每次都不执行,Rails默认使用SQL缓存来使用相同的结果,除非记录被更改了吗?

  2. 我是否还需要修改nav_links方法,或者缓存是否按预期工作,只对视图和&amp;更新网页可见性的操作?

  3. 先谢谢;我是Rails的新手,所以我希望我的问题有道理。

1 个答案:

答案 0 :(得分:0)

如果cache "nav"包含某些模板代码,则该代码将运行一次,结果将被缓存,并且缓存将被重用,直到模板更改为止。您的cache调用不引用任何数据对象,因此没有可以更改的应用程序状态会导致缓存被破坏。

此外,我非常确定expire_fragment不适用于Rails 4 cache digests.