Ruby on Rails:有效地使用lib /目录中的类

时间:2011-02-24 10:53:51

标签: ruby-on-rails ruby

我一直在构建一个文本解析器。理想情况下,它应该是一个静态类:

keywords = Dictionary.parse(text)

但是,解析器(lib / dictionary.rb)必须将一些数据(例如,'stop_words.txt')作为数组加载到内存中。

因此,据我所知,它不能是一个静态类,因为我需要一个构造函数,它可以在使用解析器之前加载该数据。

然后:

LIB / dictionary.rb

def initialize
  @stop_words = load_stop_words
end

模型/ entry.rb

def parse
    @dictionary = Dictionary.new
    self.keywords = @dictionary.parse(self.text)
end

但效率有多低?这是否意味着,如果我有1000个条目,Dictionary类加载'stop_words.txt'1000次,即使文件的内容几乎不变?

我想,我在这里遗漏了一些东西。必须有一个更好的解决方案 - 无需创建Dictionary类的多个实例,或者在应用程序运行时仅加载一次数据。

3 个答案:

答案 0 :(得分:1)

所以你的模式是你想要一个对象的实例(实例化后它是有效的常量和只读),这个实例可以从许多调用者访问,但在第一次被调用时实例化它?

此模式的名称是 Singleton ,Ruby将其作为mixin提供。

答案 1 :(得分:0)

如果你在Rails中(正如我假设的那样是标签和lib目录)那么它不会被加载N次:只在Rails启动时加载lib文件(如果你更改它们,你需要重启应用程序)所以stop_words将被加载一次。小例子(lib/timenow.rb):

module Timenow
  @now = Time.now

  def self.doit
    Rails.logger.warn "TIME NOW IS: #{@now}"
  end
end

在任何控制器中,Timenow.doit都会记录此模块的加载时间。

答案 2 :(得分:0)

我会使用一个初始化程序,它存储在config/initializers中,并且只在启动时加载,并且非常适合加载配置文件或设置内容。因此,您的Dictionary位于'/ lib and in '/config/initializers下,您创建了一个名为dictionary.rb的文件(或类似名称,实际上并不重要) 其中包含加载关键字的代码。