2013-07-09 27 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),它將執行該塊。如果塊的結果不是零,則會將其寫入緩存。然後返回值(緩存值或塊結果,如適用)。