2011-12-03 33 views
1

我正在構建一個應用程序,它通過一個使用ActiveResource的API來使用模型。我注意到,ActiveResource +緩存

@resource ||= @resource.do a query 

不起作用,即如果我把類似的東西在我的控制,我的申請仍然將查詢的API。所以沒有內置的緩存,我習慣於ActiveRecord。有時間擴展我的知識和技能基礎,好的。

我發現這個:http://injectisforwizards.com/blog/read-through-caching-of-activeresource/,雖然我還沒有完全理解這一點,對於基於控制器的查詢來說.find,這似乎工作。但不適合任何自定義查詢我已經例如:

@current_resource ||= Resource.get(:resource_all, :by_account=>@current_account.account_key) 

(其中打一個定製的控制器,並運行一個範圍,返回集合)

我的工作,通過這一點,我會發現什麼但我很好奇,如果有人能夠告訴我更簡單的術語是怎麼回事,我可以做些什麼來平滑ActiveResource中的緩存,使其更像ActiveRecord,我可以如何定製緩存所有查詢等等。有幫助。

編輯:

我發現這一點:https://github.com/Ahsizara/cached_resource看起來很有前途,但它是新的(建關上面的鏈接)......值得注意的是,似乎它不處理任何類型的收藏品,但對於一個資源發現/緩存良好。

回答

0

由於您收到每個請求的控制器的新實例,因此緩存不起作用。我假定你有這樣的事情:

def show 
    @resource ||= expensive_request 
end 

什麼是你期待@resource是該方法執行時?以前撥打電話show的結果?不會發生。

如果您希望它們在請求之間持續存在,您需要做的是將事物放入Rails.cache。如果您使用memcached作爲後端,這可能非常有效。有關第2.5節的更多信息,請參見Caching with Rails指南。

一般來說,比||=緩存方法更好的方法是定義使用memoize包裝以保存結果的受保護方法。例如:

def load_resource 
    expensive_request 
end 
memoize :load_resource 

請記住,這將僅適用於後續調用該方法相同的請求的上下文內,並且不與使用Rails.cache

+0

那麼在我的問題的後半部分,我正在測試駕駛解決方案,但事實證明,實際運行時實際上並沒有工作和錯誤,所以我仍在尋找解決方案。我很好奇在連接提到的解決方案中發生了什麼 – blueblank