2017-09-14 45 views
0

我有這基本上只是一個數據庫查詢的活動記錄模型的方法,我想緩存結果,最好是簡單地爲通過在模型中的局部變量:Rails的活動記錄模式的生命週期

my_data = method_already_called ? stored_results : do_query 

這讓我意識到我並不真正瞭解Active Record模型的對象生命週期,所有的Rails指南都告訴你關於回調。具體而言,我可以猜測,當用戶想要檢索與該對象相關的一些數據時,該對象將被創建,但我不知道該對象何時將被銷燬。

在實際層面上,比如用戶請求一些信息,這會導致創建一個AR對象,從數據庫中獲取一些實例數據並在將其呈現給用戶之前對其進行處理。如果用戶想要根據這些信息指示它執行某些操作,那麼該對象在內存中的存在時間有多長?

在此先感謝。

編輯:我特別感興趣的Ruby 2.4上的Rails 5.1的行爲。

回答

1

實際上,只要你保留對這個實例的引用即可。在大多數情況下 - 直到請求完成。因此,當你的模型將被實例化(在controller/service/etc中)時,只要你可以引用它,它就可以使用。在下一個請求中,@cached_result將被重新計算。 如果你希望緩存請求之間的東西,你可以用CacheStore:

class Model 
    def something 
    Rails.cache.fetch("cache_key") do 
     do_query 
    end 
    end 
end 

不要把緩存永久店雖然。但是這可以讓你在請求之間緩存一段時間。

btw,將爲每個模型實例計算@cached_result。如果您執行的操作類似Model.where(field: "value")可返回2+個實例,則每個實例在第一次調用時都會執行do_query