Ruby LoadError:需要{app_path}/models/model file.rb来定义模型名

Ruby LoadError:需要{app_path}/models/model file.rb来定义模型名,ruby,ruby-on-rails-3,multithreading,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.

我在运行此命令时遇到此错误

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
def self.check_all(关键字)
memo_mutex=mutex.new
备忘录={}
线程=[]
name=keyword.keyword
SITES.each do | site_和_选项|

线程假设您上面引用的代码位于模型的.rb文件中,请将
require\u relative“host”
添加到该文件的顶部。

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

此过程不是线程保存。在您的例子中,当您快速连续地创建servral线程,每个线程都试图自动加载全局类时,您会遇到竞争条件,并且会发生奇怪的事情。基本上,您有两种解决方法:

  • 在启动循环之前,可以使用
    require'host'
    在启动线程之前显式加载模型
  • 或者您可以设置
    config.threadsave。这将(除其他外)在启动服务器时预加载所有类。这是首选的,因为这样可以避免大量其他难以调试的并发性问题。有关
    config.threadsafe的更多信息,请参考Rails 4中的说明,它应该被完全删除