我有一个视图来显示保存在数据库中的资源的详细信息。有些细节属于资源模型本身,而有些细节属于关联的模型。
在视图中,我使用片段缓存的细节。
当用户按下视图上的按钮时,视图的一部分将被表单替换,因此用户可以编辑详细信息而无需加载新页面。当打开表单时,缓存已经过期(实际上是,我检查过了)。当用户提交表单(using :remote => true
)时,表单被隐藏,使用jQuery重新加载原始内容并呈现部分内容。
到目前为止一切都很好。从<% cache ... do %>
和<% end %>
内部的代码中正确地重新加载了原始内容的新值。
奇怪的是,当我重新加载页面时,一些新值消失了。取而代之的是显示一些旧值(那些应该在最后一次提交后缓存的值)。更奇怪的是,有些值被更新了,即使它们和错误的值在同一个缓存文件中。
据我所知,关联模型中的值是正确的,而Resource模型中的值是错误的(旧的)。我想知道它是否与sql缓存有关,但我认为情况并非如此,因为我认为sql缓存应该在重新加载页面时清空。
如果我打开表单并再次提交,数据就更新了,一切正常。这是最后一次提交的数据进入缓存。如果我在提交之前更改了表单中的数据,那么缓存文件中仍然包含上次提交的数据。因此,似乎提交给Resource模型的数据被一个提交延迟了,即使其他字段被正确更新。
如果我在开发中关闭缓存。Rb,一切都如我所愿。所有数据每次都更新。
顺便说一下,我的服务器也有同样的问题
有人知道吗?
不确定这是否会有所帮助,但在过去的几天里,我在自己的网站上实现了一个基于缓存键的片段缓存方案,并取得了一些成功。
我在所有模型中实现了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缓存策略似乎数据在更新后被缓存了一会儿。到目前为止,我的解决方案是在资源更新后不到两分钟的时间内取消视图中的缓存。该片段将不缓存,直到稍后有人更新页面。这不是一个很好的解决方案,因为每次查看页面时都必须查询页面上的每个资源(30个资源)的更新时间。