2011-12-08 32 views
0

這是我的數據結構。在mongodb中緩存父類

Foo 
    has_many: bar 

Bar 
    belongs_to: Foo 

我想寫的酒吧,將拔出只「精選」條目的緩存方法。

def self.get_featured 
    Rails.cache.fetch("featured", :expires_in => 1.day) do 
    self.where(:featured=>true) 
    end 
end 

這很有效。但是,顯示此數據的視圖還會調用信息,如 featured.foo.title,它不會作爲.get_featured方法的一部分進行緩存。

每次我調用類似的東西時,數據庫會再次被觸發,每頁發生> 40次,從而導致數據庫崩潰。

問題,如何緩存過濾Bar和Foo信息的所有過濾記錄的酒吧?

回答

2

您可以使用mongoid includes通過指定關係名稱來加載數據。但目前它僅限於1級深度。所以我相信它會急於加載富有特色的,但不知道酒吧。您可以自己

def self.get_featured 
    Rails.cache.fetch("featured", :expires_in => 1.day) do 
    self.includes(:foo,:bar).where(:featured=>true) 
    end 
end 

嘗試爲了使其工作,Mongoid標識映射必須在mongoid.yml啓用這樣

identity_map_enabled: true 
+0

我給它一個嘗試。謝謝! – Kirill

+0

這似乎在自己的工作,但沒有爲我的東西設置的方式工作。該方法應該將數據拉入'@featured'變量,然後使用:collection =>'@featured'渲染部分。但是,我得到一個無法修改凍結對象的錯誤,當我嘗試。 我想知道是否因爲我已經查看這些對象的緩存。將嘗試不同的方法。 – Kirill