某些字段在Rails中的片段缓存中获取旧值

时间:2013-01-19 21:27:37

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

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

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

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

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

奇怪的是,当我重新加载页面时,一些新值已经消失。而是显示一些旧值(那些应该在上次提交后缓存的值)。甚至更奇怪的是,某些值会更新,即使它们与错误的值在同一个新缓存文件中也是如此。

据我所知,关联模型中的值是正确的,而资源模型中的值是错误的(旧)。我想知道它是否与sql缓存有关,但我不认为是这种情况,因为我认为在重新加载页面时应该清空sql缓存。

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

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

顺便说一下,我在服务器上遇到同样的问题。

任何有线索的人?

2 个答案:

答案 0 :(得分:0)

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

我在所有模型中实现了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

答案 1 :(得分:0)

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