0

如果在服务器以开发模式运行时检测到文件更改,Rails 会擦除类并重新加载它们。我有以下结构:

app/models/algorithms/algorithms.rb (Module Algorithms)

app/models/algorithms/algorithm.rb (Base Class Algorithms::Algorithm)

app/models/algorithms/algorithm_a.rb (Extended Classes Algorithms::AlgorithmA)
app/models/algorithms/algorithm_b.rb (Extended Classes Algorithms::AlgorithmB)
app/models/algorithms/algorithm_c.rb (Extended Classes Algorithms::AlgorithmC)

这些具体的算法类不是由控制器实例化,而是在 Sidekiq 工作类中实例化app/workers,这意味着通常不在 Rails 进程内,而是在 Sidekiq 进程内。

现在,如果我对任何文件(例如控制器)进行更改,Rails 会擦除这些类并重新加载它们。这很好,但它不会重新加载整个app/models/algorithms目录。

为什么呢?我如何配置它以每次都急切地加载所有内容?我已经设置config.eager_loadtrue. 直到我在一个 pry session 中一个接一个地引用每个类,然后再一个一个地再次加载,问题才解决。

4

1 回答 1

1

查看http://edgeguides.rubyonrails.org/configuring.html上的文档,您似乎可以为急切加载添加自定义路径。

我引用:

  • config.eager_load 为真时,急切加载所有注册的 config.eager_load_namespaces。这包括您的应用程序、引擎、Rails 框架和任何其他已注册的命名空间。

  • config.eager_load_namespaces 注册在 config.eager_load 为 true 时预先加载的命名空间。列表中的所有命名空间都必须响应 eager_load!方法。

不过,我觉得有趣的是以下内容。

  • config.eager_load_paths 接受一个路径数组,如果启用了缓存类,Rails 将在启动时从这些路径中进行预加载。默认为应用程序的 app 目录中的每个文件夹。

对我来说,这也会正确地加载您的文件。

我会尝试将以下内容添加到config/application.rb

config.eager_load_paths += Rails.root.join('app/models/algorithms')

注意:这仅在cache_classes设置为 时有效true

您还可以预先加载命名空间,这可以通过执行以下操作来完成:

config.config.eager_load_namespaces += Algorithms

然后实现一个eager_load!正确处理设置的方法。

于 2013-08-15T21:52:54.537 回答