2011-05-27 44 views
7

在保持「get或set」緩存調用簡潔的同時清除此警告的最佳方法是什麼?我真的很喜歡不必做一個GET,然後檢查爲零,然後設置...Rails緩存:替換Rails.cache.fetch上的expires_in

# 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 
+1

只是要注意,使用Rails 4,還有更多的向俄羅斯娃娃高速緩存的趨勢,其中有沒有必要的到期時間。到期時間仍然可以更容易,但現在有時候這是一種反模式。 – mahemoff 2014-05-17 17:14:34

+0

Rails 4不會爲該語法提供棄用警告。 – 2016-02-17 11:34:33

回答

5

我真的很喜歡不必做一個GET,然後檢查爲零,然後設置...

是的,你一定要避免這樣做,在每次調用,但你會至少還需要這樣做一次。簡單的東西這樣可以爲你工作:

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的緩存存儲有一個默認的到期時間,當你創建它,你可以設置,因此除非您需要不同的到期時間,否則您可能無需在每次通話中覆蓋該通知。

0
+0

btw rails 3.1通過將rack :: cache添加到默認堆棧中將其改變了一點: https://gist.github.com/958283 – courtsimas 2011-05-27 21:55:14

+0

fresh_when和expires_when是與HTTP響應相關的控制器方法;問題是關於通用數據緩存而不考慮Web服務。 – mahemoff 2014-05-17 17:12:31

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