我想要一个只加载一次的配置模块。
我的代码是
module Configuration
extend self
def settings
@settings ||= # some code that loads the settings
end
end
class SomeClass
include Configuration
def evaluate
settings.get_some_setting
end
end
我希望 @settings
被评估并设置一次,但在运行 Rails 服务器时,我看到 @settings
在对服务器的不同 API 调用中重新创建。
我假设要么我没有正确使用变量,要么在每次 API 调用时都实例化了模块(可能是由于不同的线程)。
让 @settings
只计算一次的正确方法是什么?
答案 0 :(得分:3)
您可以在启动时通过在 config/initializers 中包含初始化程序来初始化一次,例如:
# config/initializers/settings.rb
settings = # some code that generates the settings
config = Struct.new(:settings)
Configuration = config.new(settings)
然后在您的应用中,例如:
special_value = Configuration.settings.special_value
答案 1 :(得分:1)
您的猜测是正确的:
<块引用>在每次 API 调用时都会实例化模块(可能是由于不同的线程)
如果函数开销很大,可以使用 Rails 缓存来记忆设置值:
def settings
Rails.cache.fetch('settings') do
init_settings
end
end
注意 expires_in
参数被省略,以免缓存值过期。