Rails 4:从启动过程的哪一步我可以检查ActiveRecord::基类



我想执行一些检查数据库资源只有当应用程序启动/重新启动(如果任何新的迁移发生在两者之间)通过调用:

resources = ActiveRecord::Base.send(:subclasses).map { |subclass| subclass.name }

我尝试在初始化过程的不同步骤插入这段代码,但没有成功(结果得到一个空数组)。为什么?我应该把它插入哪里呢?

如果我在ApplicationController中执行此检查,它将始终被执行。我只需要在启动后运行一次。

我可以在哪里插入它?

整理别人之前给出的答案要点:

开发环境中,您的模型类将不会被急切加载。只有在调用引用模型类的代码时,才会加载相应的文件。(详细信息请参阅"自动加载")

因此,如果您需要在启动rails服务器时做一些检查,您可以手动调用

Rails.application.eager_load!
然后用 获取所有模型类的列表
model_classes = ActiveRecord::Base.descendants

对于与其数据库表相关联的模型名称列表,您可以使用

model_classes.map{ |clazz| [clazz.model_name.human, clazz.table_name] }.sort

您可以将代码放在config/initializers目录下任意命名的文件中。该目录下的所有ruby文件将在启动时按字母顺序加载。

急切加载当然会花费一些时间,因此在开发环境中会减慢服务器和控制台的启动速度。

其他方法,如解析app/models目录中的文件名列表,在更复杂的Rails应用程序中并不可靠。

如果在Rake任务中,请确保在发送eager_load!之前正确初始化您的应用程序。为此,让您的rake任务依赖于:environment

HTH !

最新更新