首页 > 解决方案 > 如何将 Rails 模型文件拆分为多个文件(不是关注点,不是模块,只是单独的文件)?

问题描述

我在单个文件 foo.rb 中定义了一个 Rails 4 模型 Foo

# app/models/foo.rb
class Foo < ActiveRecord::Base
  def method1
    ...
  end

  def method2
    ...
  end
end

没有任何类型的类重新定义(例如,没有重构以使用特征或关注点),我想简单地一些代码移动到一个新文件 foo_more.rb

# app/models/foo.rb
require File.expand_path('../foo_more.rb', __FILE__)
class Foo < ActiveRecord::Base
  def method1
    ...
  end
end

# app/models/foo_more.rb
class Foo < ActiveRecord::Base
  def method2
    ...
  end
end

当我这样做时,使用require,它可以工作,但在更改该文件中的代码后不会在dev't中重新加载。

有没有办法告诉 Rails 在代码更改后重新加载开发中的新文件?

标签: ruby-on-rails

解决方案


require_dependency File.expand_path('../foo_more.rb', __FILE__)
class Foo < ActiveRecord::Base
  def method1
    ...
  end
end

# app/models/foo_more.rb
class Foo < ActiveRecord::Base
  def method2
    ...
  end
end

require_dependency(file_name, message = "没有要加载的文件 -- %s")

使用机制解释文件并将其定义的常量标记为自动加载。file_name 可以是字符串或响应 to_path。

常见用法:

在绝对需要在该点定义某个常量的代码中使用此方法。一个典型的用例是为不同命名空间中具有相同相对名称的常量确定常量名称解析,否则它们的评估将取决于加载顺序。

在开发驻留在我的 rails 应用程序中的类或模块时,我通常使用 require_dependency,可能在 lib/ 目录中。正常的 require 语句不会重新加载我的更改,因此我在引用我新开发的类或模块的文件中使用 require_dependency。

资源

请注意,您的里程可能会有所不同。有些人在包含新的依赖项时会经历严重的减速。我相信这会在您每次调用Foo.all,Foo.find(1)等时重新加载文件。因此,您可能应该只在开发中这样做。


推荐阅读