2011-02-18 53 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