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

时间:2012-03-22 15:56:56

标签: ruby-on-rails performance yaml

我有一些大型数组需要可用于特定视图。目前我将这些存储在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'))

  # ...

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:6)

  

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

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

  

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

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

  

有人可以提出这方面的最佳做法吗?

保持原样,缓存只将解析转发给第一个请求 而不是在启动时,因为老工人你有时间 还在运行。