2008-11-22 46 views
0

我有一個類中查找一個實例是昂貴的,所以實例緩存:如何在Rails.cache中放置(部分)大對象圖?

class Foo 
    def self.find(id) 
    Rails.cache.fetch("Foo.#{id}") do 
     // some expensive lookup, like an HTTParty request, or a long SQL query 
     ... 
    end 
    end 
end 

這工作正常,直到Foo■找相關Foo S:

class Foo 
    def children 
    @child_foo_ids.map { |id| Foo.find(id) } 
    end 
end 

我想使用||=緩存來保存多次往返:

class Foo 
    def children 
    @children ||= @child_foo_ids.map { |id| Foo.find(id) } 
    end 
end 

Rails.cache凍結日e找到Foo s,所以在創建和緩存對象後我無法設置實例變量。 (即該方法提出了一個TypeError

一個解決辦法是預先取得的parent當我第一次做昂貴的發現,但最終可能會加載巨大對象圖時,我只想要一個或兩個實例。

回答

5

可以使用||=緩存;你只需要使用一個小的間接:

class Foo 
    def initialize 
    @related_objects = {} 
    end 
    def children 
    @related_objects[:children] ||= @child_foo_ids.map { |id| Foo.find(id) } 
    end 
end 

Rails.cache不會凍結每個Foo的實例變量,從而使Hash可以修改!

PS:是的,我剛剛在同一時間發佈了這個問題和答案。我認爲社區可以從我的鬥爭中受益。

相關問題