LoadError:期望{app_path} / models / model file.rb定义模型名称

时间:2012-07-04 14:10:35

标签: ruby ruby-on-rails-3 multithreading

运行此

时出现此错误
LoadError: Expected /home/user/Desktop/Tripurari/myapp/app/models/host.rb to define Host##

但是每件事都在它的位置。有人可以告诉我方法下面的确切问题是什么。

def self.check_all(keyword)
  memo_mutex = Mutex.new
  memo       = {}
  threads    = []
  name       = keyword.keyword
  SITES.each do |site_and_options|
    threads << Thread.new do
      @host = Host.find_or_create_by_name(site)
      if keyword.unavailable_usernames.find_by_host_id(@host.id)
        memo[@host.name] = true
      else
        memo[@host.name] = false
      end
    end
  end
  threads.each { |t| t.join }
  memo
end

2 个答案:

答案 0 :(得分:6)

问题可能是由自动加载器引起的。如果在第一次进入创建几个新线程的循环时尚未加载Host类,则会自动加载,即Rails在加载路径中搜索与命名约定匹配的文件并要求它。

此过程不是threadave。在您的情况下,当您快速连续创建服务线程时,每个人都尝试自动加载全局类,您会遇到竞争条件并发生奇怪的事情。基本上,您有两种方法可以解决这个问题:

  1. 您可以在开始循环之前使用require 'host'在启动线程之前显式加载模型。
  2. 或者您可以在初始化程序中设置config.threadsave!。这将(除其他外)在启动服务器时预加载所有类。这是首选,因此,您可以避免大量其他难以调试的并发问题。有关config.threadsafe!的详细信息,请参阅excellent article by Aaron Patterson,认为它应该在Rails 4中完全删除。

答案 1 :(得分:0)

假设您上面引用的代码位于模型的.rb文件中,请将require_relative "host"添加到该文件的顶部。