【问题标题】:Some fields get old values in fragment cache in Rails某些字段在 Rails 的片段缓存中获取旧值
【发布时间】:2013-01-03 08:28:26
【问题描述】:

我有一个视图来显示保存在数据库中的资源的详细信息。一些细节属于 Resource 模型本身,一些细节属于关联模型。

在视图中,我使用片段缓存来获取细节。

当用户按下视图上的按钮时,视图的一部分会被表单替换,因此用户可以在不加载新页面的情况下编辑详细信息。打开表单时,缓存已过期(实际上是,我已经检查过)。当用户提交表单(using :remote => true)时,表单被隐藏,使用jQuery重新加载原始内容并渲染部分。

到目前为止,一切正常。使用 <% cache ... do %><% end %> 内部代码中的新值正确重新加载原始内容。

奇怪的是,当我重新加载页面时,一些新值消失了。而是显示一些旧值(那些应该在最后一次提交后被缓存的值)。更奇怪的是,一些值被更新了,即使它们与错误值在同一个新缓存文件中。

据我所知,关联模型中的值是正确的,而 Resource 模型中的值是错误的(旧的)。我一直在想是不是和sql缓存有关系,但我觉得不是这样,因为我觉得重新加载页面的时候应该清空sql缓存。

如果我打开表单并再次提交,数据会更新,一切正常。那就是上次提交的数据正在进入缓存。如果我在提交之前更改了表单中的数据,它仍然是缓存文件中包含的上次提交的数据。因此,即使其他字段已正确更新,似乎为 Resource 模型提交的数据也会延迟一次提交。

如果我在 development.rb 中关闭缓存,一切都会按预期进行。所有数据每次都会更新。

顺便说一下,我的服务器上也有同样的问题。

有人知道吗?

【问题讨论】:

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


    【解决方案1】:

    不确定这是否会有所帮助,但在过去的几天里,我在自己的网站上实现了一个基于缓存键的片段缓存方案并取得了一些成功。

    我在所有模型中都实现了一个 get_cache_key 函数

      def get_cache_key(prefix=nil)
        cache_key = []
        cache_key << prefix if prefix
        cache_key << self
    
        child_objects.in_sort_order.each do |child_object|
          cache_key << child_object.get_cache_key
        end
    
        return cache_key.flatten
      end 
    

    在我看来,然后我使用了

    <% cache(@home_page.get_cache_key('some_name_for_fragment')) do %>
    ...Render View
    <% end %>
    

    模型现在会生成一个缓存键,如果父模型或其任何子模型发生更改,该缓存键将使缓存失效。

    完整的文章在这里,在我的网站上。 Rails caching strategy using key-based approach

    【讨论】:

    • 除了不包括您的“签名”外,还请记住,当您链接到您自己的网站时,您必须披露它是您的网站。我已在此处为您添加了所需的披露信息。
    • 感谢您的回复!在此之前,我还没有时间(也没有动力)完全进入这个领域。由于缓存文件实际上已被删除,我认为您的解决方案将无济于事。所以我尝试了别的东西。我希望它有效! :-)
    【解决方案2】:

    似乎数据在更新后不久就被缓存了。到目前为止,我的解决方案是在资源更新后不到两分钟的时间内删除视图中的缓存。该片段未缓存,直到有人稍后更新该页面。这不是一个很好的解决方案,而页面上的每个资源(30个资源)每次查看页面时都必须查询更新时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 2014-08-02
      • 2017-05-09
      相关资源
      最近更新 更多