在我的Rails控制器中将YAML文件作为常量加载是否有效?

Set*_*Bro 4 performance yaml ruby-on-rails

我有几个大型数组需要可用于特定视图.目前我将这些存储在YAML文件中并加载到控制器常量中,如下所示.

我假设当Rails在环境设置期间加载文件时,这个常量存储在内存中,但是我的偏执部分想知道每次访问该控制器时我是否都在访问文件系统.有人可以建议这方面的最佳做法吗?

class OnboardingController < ApplicationController

  BRANDS = YAML.load(File.open("#{Rails.root}/config/brands.yml", 'r'))
  STORES = YAML.load(File.open("#{Rails.root}/config/stores.yml", 'r'))

  # ...
Run Code Online (Sandbox Code Playgroud)

Rea*_*onk 7

我假设当Rails在环境设置期间加载文件时,此常量存储在内存中

是的,当文件被加载/需要时,其中的所有内容都被执行并分配.因此它只加载一次.

但是我的偏执部分想知道每次访问控制器时我是否正在访问文件系统.

部分正确,在开发模式下,每个请求都没有设置常量,但这在生产中无关紧要.

有人可以建议这方面的最佳做法吗?

保持原样,缓存只将解析转发到第一个请求,而不是在你有时间的启动时,因为旧工作者仍在运行.


kry*_*our 6

你可以懒得加载它

class OnboardingController < ApplicationController  
  def brand_values
    @@brand_values ||= YAML.load((File.open("#{Rails.root}/config/brands.yml", 'r'))
  end

  def stores_values
    @@stores_values ||= YAML.load((File.open("#{Rails.root}/config/stores.yml", 'r'))
  end

end
Run Code Online (Sandbox Code Playgroud)