0

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

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

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

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

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

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

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

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

顺便说一句,我确实在我的服务器上遇到了同样的问题。

任何有线索的人?

4

2 回答 2

0

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

于 2013-02-06T13:53:01.537 回答
0

Not sure if this will help, but in the last couple of days I have implemented a cache-key based fragment cache scheme on my own site with some success.

I implemented a get_cache_key function in all my models

  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 

In my views I then used

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

The models now produce a cache key that will invalidate the cache if parent model or any of its children are changed.

The full write up is here, on my website. Rails caching strategy using key-based approach

于 2013-01-22T22:44:32.087 回答