解决方法
你在这里寻找
fragment caching,它发生在视图层.片段缓存和存储内容的到期非常容易.你有一本书的清单,所以我们说你的观点看起来像这样:
<ul> <% @books.each do |book| %> <li><%= book.name %></li> <% end %> </ul>
要为此位启用缓存,只需将其包装在缓存中:
<% cache do %> <ul> <% @books.each do |book| %> <li><%= book.name %></li> <% end %> </ul> <% end %>
当然,这并没有命名缓存或做任何特别的事情……虽然Rails会自动选择这个缓存片段的唯一名称,但它不会真正有用.我们可以做得更好.让我们使用DHH的key-based cache expiration技术,并为缓存提供与其内容相关的名称.
<% cache ['book-list',*@books] do %> <ul> <% @books.each do |book| %> <li><%= book.name %></li> <% end %> </ul> <% end %>
将参数传递到缓存中会根据提供的参数构建缓存键.字符串直接传入 – 因此,在这里,缓存将始终以“book-list”开头.这是为了防止缓存与其他可能缓存相同内容但具有不同视图的位置发生冲突.对于@books数组的每个成员,Rails将调用cache_key:对于ActiveRecord对象,这将产生一个由其模型ID组成的字符串,而且最重要的是,最后一次更新对象.
这意味着当您更新对象时,此片段的缓存键将更改.换句话说,它会自动过期 – 当书籍更新时,此缓存语句将搜索不存在的键,认为它不存在,并用新内容填充它.旧的,陈旧的内容将在您的缓存存储中停留,直到被内存或年龄限制驱逐(memcached会自动执行此操作).
我在许多生产应用程序中使用此技术,它的工作非常好.有关更多信息,请查看37signals post,有关Rails中的常规缓存信息,请参阅Ruby on Rails caching guide.