gpt4 book ai didi

ruby-on-rails - Rails 3:缓存到全局变量

转载 作者:行者123 更新时间:2023-12-03 20:55:55 25 4
gpt4 key购买 nike

我确信“全局变量”将使每个人的脖子后面的头发直立。我想做的是将一个分层菜单存储在act_as_tree数据表中(完成)。在application_helper.rb中,我通过查询数据库并遍历树(完成)来创建html菜单。我不想为每个页面加载都这样做。

这是我尝试过的:

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


我现在的立场是,在首页加载时,确实查询了数据库并构建了菜单。结果存储在config变量中,因此永远不会再命中数据库。

这是缓存过期部分不起作用。当我将config.menu变量重置为nil时(大概是下次通过my_menu_builder进行重置),它将检测到该更改并重建菜单,从而缓存新结果。似乎没有发生。

问题:

Application.config是存储此类内容的好地方吗?
有人看到这种缓存策略有明显的缺陷吗?

不要说过早的优化-这就是我所处的阶段。过早的优化迭代:)

谢谢!

最佳答案

实现此目的的一种方法是在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

这是学习各种形式的缓存的地方。

关于ruby-on-rails - Rails 3:缓存到全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5036235/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com