有没有办法在我的 rails 应用程序中找出所有 Mongoid 模型名称。我可以通过在我的 app/models 文件夹中获取所有文件来找到所有模型,但我特别想要 mongoid 模型名称。
4 回答
您可以在 Mongoid 3.1 及更高版本中执行此操作:Mongoid.models
如果您处于 Rails 的开发模式,模型不会自动加载,请运行Rails.application.eager_load!
以加载整个应用程序。
如果您的模型类已经加载,那么您可以通过查找所有包含 Mongoid::Document 模块的类来列出它们。
Object.constants.collect { |sym| Object.const_get(sym) }.
select { |constant| constant.class == Class && constant.include?(Mongoid::Document) }
或者如果你只想要类名:
Object.constants.collect { |sym| Object.const_get(sym) }.
select { |constant| constant.class == Class && constant.include?(Mongoid::Document) }.
collect { |klass| klass.name }
如果您需要在运行之前强制加载模型,您可以这样做(在 Rails 3 中):
Dir["#{Rails.root}/app/models/**/*.rb"].each { |path| require path }
(假设您的所有模型都在app/models
或子目录中)
问题Mongoid.models
是显然只返回已经加载的模型。我在 Rails 控制台中做了以下实验(我有三个模型:Admin
和User
)Device
:
irb(main)> Mongoid.models
=> [Admin, User]
但是如果我实例化类Device
然后调用相同的方法,我会得到不同的结果:
irb(main)> Device.last
=> #<Device _id: 52c697494d616308cf380000, type_code: "666", name: "My device">
irb(main)> Mongoid.models
=> [Admin, User, Device]
所以这可能代表一个问题,特别是如果该方法是从 rake 任务中调用的。Chris 的解决方案运行良好,所以我想这是目前最好的选择:S(我无法使用 Rails 4 使用 Steve 的解决方案)。
这是我编写的一个要点,用于获取所有 Mongoid 模型,并可选择按超类过滤它们(例如,如果您只想获取从特定类继承的模型)。
https://gist.github.com/4633211
(与史蒂夫解决方案相比,它也适用于命名空间模型)