2011-10-04 32 views
1

在我的應用程序中有對象,它們屬於國家,地區,城市,類型,團體,公司和其他集合。每個集合都很簡單 - 它有id,name,有時還有一些指向其他集合的指針,並且它永遠不會改變。一些集小,我打開他們的before_filter這樣的:在rails中緩存一堆簡單的查詢

@countries = Country.all 
@regions = Region.all 

但後來我打電話,例如, offer.country.name 或 region.country.name 和我的應用程序進行單獨的數據庫按ID查詢,儘管我已經加載了它們全部。在此之後,我通過:include執行查詢,並且這種情況通過急切加載生成的ids不依賴於我已經使用另一個按查詢ID加載了這些數據。

所以我想要一些緩存。例如,我可以用keys生成散列作爲records_id在我的before_filter中,然後調用@countries [offer.country_id] .name。這種情況下,似乎我不需要急切的加載,這很容易在這裏打開Rails.cache。但也許有一些聰明的內置導軌解決方案,不需要重寫所有內容?

回答

1

緩存像這樣的模型列表不會緩存其他模型關聯中存在的單個實例。

Rails團隊一直致力於在Rails 3.1中實現Identity Maps來解決這個確切問題,但現在它默認是禁用的。您可以啓用它並查看它是否適合您的問題。

+0

我切換到Rails 3.1並打開了身份映射,看起來他們工作,所以我只有每個@country = Country.find(1)的一個實例。但它不完全是我想要的,因爲身份映射不會減少對數據庫的查詢次數。理想情況下,必須有一個sql解析器來比較兩個查詢,並發現其中一個結果(部分)與另一個匹配。常見的任務很複雜,但在活動記錄查找(:ids)和所有方法中使用一些cache-by-id似乎相當容易。 – Kasheftin