【问题标题】:How does fragment & ActiveRecord or SQL caching work in Rails 4?片段和 ActiveRecord 或 SQL 缓存如何在 Rails 4 中工作?
【发布时间】:2014-03-16 02:39:27
【问题描述】:

好的,我有一个基本的 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

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

  1. Rails 是否仍会执行 before_filter、查询数据库并在每次访问时重新填充 @nav_links 哈希?还是仅当视图在缓存中找不到@nav_links 的副本时才调用它?如果不是每次都执行,Rails 是否默认使用 SQL 缓存来使用相同的结果,除非记录被更改?

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

提前致谢;我是 Rails 的新手,所以我希望我的问题有意义。

【问题讨论】:

    标签: ruby-on-rails ruby caching


    【解决方案1】:

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

    另外,我相当肯定 expire_fragment 不适用于 Rails 4 cache digests.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-24
      • 2015-01-01
      • 2012-09-18
      • 2014-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-18
      相关资源
      最近更新 更多