2013-07-09 31 views
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 

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

我该如何更好地简化它?

+0

将结果存储在temp var? – apneadiving

+0

这看起来并不像缓存存储的有效使用。整个观点应该是,只有在需要时才应该调用该块。如果你不介意我的问题,你为什么这样做? –

+0

'block.call.nil?'调用'block' - 这就是'call'方法的作用。如果'key'还没有在缓存中,'Rails.cache.fetch'也会在'block'上调用'call'。这就是为什么你看到这两个调用。也许你打算写'block.nil?'? –

回答

1
def cache_key(key, options = {}, &block) 
    value = block.call 
    return nil if value.nil? 
    Rails.cache.fetch(key, expires_in: 30.minutes) { value } 
+0

我认为这可能是原始海报试图做的,但我不明白为什么有人会想这样做。这不是缓存任何东西。 –

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),它将执行该块。如果块的结果不是零,则会将其写入缓存。然后返回值(缓存值或块结果,如适用)。