0

我正在使用以下 Rails 3 模型来动态创建模型:

# encoding: UTF-8

require_dependency 'read_only'
require_dependency 'readings_methods'

class Reading < ActiveRecord::Base
  self.abstract_class = true

  include ReadOnly
  include ReadingsMethods

  @@mutex = Mutex.new
  @@children = {}

  def self.with_table(t)
    @@mutex.synchronize do
      child = @@children[t]
      if child.nil?
        child = Class.new(self) do
          self.table_name = t
        end
        @@children[t] = child
      end

      child
    end
  end
end

然而,调试显示,@@children在每次页面加载时都会重置,从而使每个页面加载非常非常缓慢。我该如何防止这种情况?是什么原因造成的?除非我记住孩子,否则 Rails 会进入无限循环,这让我相信每当我创建一个新模型或类似的东西时,它至少会重新加载一些类。如何防止这种行为?

4

1 回答 1

1

Rails 在开发模式下为您重新加载代码,这样您就不必每次进行更改时都重新启动 rails 服务器(在 rails 3.2 中,它尝试仅重新加载已更改的代码)。

当一个类被重新加载时,rails 取消设置常量并加载一个新的副本,所以特别是新的将有一组新的类变量。

ActiveSupport::Dependencies.autoload_once_pathsActiveSupport::Dependencies.autoload_paths控制以这种方式重新加载的内容。您应该能够将文件的(完整)路径添加到 autoload_once_paths 以防止重新加载一个文件(但是您必须重新启动 rails 以便查看对其所做的任何更改)

于 2013-03-29T09:18:03.800 回答