如何只在 Rails 中启动一个模块一次

我想要一个只加载一次的配置模块。

我的代码是

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 只计算一次的正确方法是什么?

whqjj19860309 回答:如何只在 Rails 中启动一个模块一次

您可以在启动时通过在 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
,

您的猜测是正确的:

在每次 API 调用时都会实例化模块(可能是由于不同的线程)

如果函数开销很大,可以使用 Rails 缓存来记忆设置值:

def settings
  Rails.cache.fetch('settings') do
    init_settings
  end
end

注意 expires_in 参数被省略,以免缓存值过期。

本文链接:https://www.f2er.com/987.html

大家都在问