Rails 关于 Rails 片段缓存的问题

loyalpartner · 2015年02月26日 · 最后由 ruby_sky 回复于 2015年02月27日 · 1488 次阅读

rails : 4.2.0

categories.html.slim

- cache @categories do
  = render partial:'categories/category', collection: @categories

生成的 key views/categories/54edfc726361706be9110000-20150225164642/categories/54edfc7c6361706be9120000-20150225164652/categories/54ee858a6361706be9130000-20150226024745/324cb0a5ab4174ae355d6a2a7c743788

可是我看 ruby-china 生成的 key 却非常短小 views/topics/1-20150225075122/49929836d7129d879165674c539c10bd

请问 ruby-china 是怎么做的呢?

正常的,原理大概如下:

views 是 namespace

类似 categories/54edfc726361706be9110000-20150225164642/ 这是每个 category 的 cache_key 其中: categories 类似 table name 54edfc726361706be9110000-20150225164642 前半部分是 id,后半部分是 updated_at

你这里 @categories 应该有 3 条记录,并且没有对 id 做处理 mongodb 生成的 id 都这么长的,ruby-china 不清楚哪处理了 )O( ...

324cb0a5ab4174ae355d6a2a7c743788 根据当前 controller#action 生成

你要纠结的话,给 @categories (Relation 实例) 写个 cache_key 方法,或许可以解决 ...

看 Rails cache_key 的实现:

def retrieve_cache_key(key)
  case
  when key.respond_to?(:cache_key) then key.cache_key
  when key.is_a?(Array)            then key.map { |element| retrieve_cache_key(element) }.to_param
  when key.respond_to?(:to_a)      then retrieve_cache_key(key.to_a)
  else                                  key.to_param
  end.to_s
end

Ruby China 是通过 collection partial 的形式来 render topic,所以每个 cache key 都是 topic.cache_key 生成。 而 LZ 是直接使用 collection 做 cache key,自然会取出 collection 里面所有的对象的 cache_key 拼接成字符串。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号