Rails缓存:替换Rails.cache.fetch上的expires_in

时间:2011-05-27 19:52:51

标签: ruby-on-rails

在保持“获取或设置”缓存调用的简洁性的同时清除此警告的最佳方法是什么?我真的不喜欢搞定,然后检查nil,然后设置......

# DEPRECATION WARNING: Setting :expires_in on read has been deprecated in favor of setting it on write.

@foo = Rails.cache.fetch("some_key", :expires_in => 15.minutes) do
    some stuff
end

3 个答案:

答案 0 :(得分:5)

  

我真的不喜欢搞定,然后检查nil,然后设置......

是的,你会希望避免在每次通话时都这样做,但你仍然必须至少做一次。像这样简单的东西可能适合你:

def smart_fetch(name, options, &blk)
  in_cache = Rails.cache.fetch(name)
  return in_cache if in_cache
  val = yield
  Rails.cache.write(name, val, options)
  return val
end

然后在你的观点中你可以做到:

@foo = smart_fetch("some_key") do
  some stuff
end

请注意,Rails缓存存储具有您在创建时可以设置的默认到期时间,因此您可能不需要在每次调用时覆盖它,除非您需要不同的到期时间。

答案 1 :(得分:5)

@briandoll提供的有用方法的小改动:

def smart_fetch(name, options = {}, &blk)
  in_cache = Rails.cache.fetch(name)
  return in_cache if in_cache
  if block_given? 
    val = yield 
    Rails.cache.write(name, val, options) 
    return val 
  end 
end

答案 2 :(得分:0)