0

我在我的应用程序中使用缓存,并使用了一种常用方法来获取密钥。

def cache_key(key, options = {}, &block)
  unless block.call.nil?
    Rails.cache.fetch(key, expires_in: 30.minutes, &block)
  else
    return nil
  end
end

在上面的示例中,我试图获取块的结果。如果它是 nil,我不想获取密钥并返回 nil。在这种情况下,块被调用两次,所以如果我运行这个方法,它会生成两个查询。

我怎样才能更好地简化这个?

4

2 回答 2

1

你真正想要的是:

def cache_key(key, options = {}, &block)
  options = options.merge(expires_in: 30.minutes)
  unless value = Rails.cache.read(key, options)
    value = block.call
    Rails.cache.write(key, value, options) unless value.nil?
  end
  value
end

这将首先尝试读取缓存。如果值为 ( nil, false),它将执行该块。如果块的结果是非零,它会将其写入缓存。然后返回该值(缓存值或块结果,视情况而定)。

于 2013-07-10T01:25:03.753 回答
1
def cache_key(key, options = {}, &block)
  value = block.call
  return nil if value.nil?
  Rails.cache.fetch(key, expires_in: 30.minutes) { value }
于 2013-07-09T13:53:55.823 回答