2011-02-18 85 views
2

我確定「全局變量」會讓每個人脖子後面的頭髮站立起來。我想要做的是在一個acts_as_tree數據表中存儲一個分層菜單(完成)。在application_helper.rb中,我通過查詢數據庫並遍歷樹(完成)來創建一個html菜單。我不想爲每個頁面加載執行此操作。Rails 3:緩存到全局變量

這裏是我的嘗試:

application.rb中

config.menu = nil 

application_helper.rb

def my_menu_builder 
    return MyApp::Application.config.menu if MyApp::Application.config.menu 
    # All the menu building code that should only run once 
    MyApp::Application.config.menu = menu_html 
end 

menu_controller.rb

def create 
    # whatever create code 
    expire_menu_cache 
end 

protected 
def expire_menu_cache 
    MyApp::Application.config.menu = nil 
end 

我的立場正確ñ ow是在第一次加載頁面時,數據庫確實被查詢並建立了菜單。結果存儲在配置變量中,並且數據庫永遠不會再爲此命中。

這是不工作的緩存過期部分。當我將config.menu變量重置爲零時,大概是下一次通過my_menu_builder時,它會檢測到該變化並重建菜單,緩存新的結果。似乎沒有發生。

問題:

是Application.config的好地方來存儲這樣的東西? 有沒有人在這個緩存策略中看到明顯的缺陷?

不要說過早的優化 - 這是我在階段過早的優化迭代:)

謝謝!實現這一

回答

3

的一種方法是在你的application.rb文件中設置一個空的哈希:

MY_VARS = {} 

然後你就可以添加任何你在這個哈希是訪問無處不在想要的。

MY_VARS[:foo] = "bar" 

和其他地方:

MY_VARS[:foo] 

當你覺得,這不是Rails的方式行事,即使它的工作原理。有在Rails中使用緩存不同的方式:

  • 在內存簡單緩存解釋here

    Rails.cache.read("city") # => nil

    Rails.cache.write("city", "Duckburgh")

    Rails.cache.read("city") # => "Duckburgh"

  • 使用一個真正的引擎一樣memcached

我鼓勵你看看http://railslab.newrelic.com/scaling-rails

這是學習的緩存中的所有它的形狀的地方。

+0

我要將此作爲回答,但要注意,jemminger的是同樣正確的,但不是在它的面前儘可能多的信息。那正是我正在尋找的。 Rails.cache。現在Memcached對這個釘子來說太大了。 – 2011-02-18 06:48:12