在我的应用程序中查找所有mongoid模型名称

时间:2012-06-02 07:08:08

标签: ruby-on-rails-3 mongoid

有没有办法找到我的rails应用程序中的所有Mongoid模型名称。我可以通过获取app / models文件夹中的所有文件找到所有模型,但我特别想要mongoid模型名称。

4 个答案:

答案 0 :(得分:13)

如果您的模型类已经加载,那么您可以通过查找包含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或子目录中)

答案 1 :(得分:12)

您可以在Mongoid 3.1及更高版本中执行此操作:Mongoid.models

如果您处于未自动加载模型的Rails开发模式,请运行Rails.application.eager_load!以加载整个应用程序。

答案 2 :(得分:3)

Mongoid.models的问题是显然只返回已经加载的模型。我在rails控制台中做了以下实验(我有三个模型:AdminUserDevice):

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任务调用该方法。克里斯&#39;解决方案工作正常所以我想这是目前最好的选择:S(我无法使用Rails 4解决Steve的解决方案)。

答案 3 :(得分:1)

这是我编写的一个要点,以获取所有Mongoid模型,并可选择按超类过滤它们(例如,如果您只想获取从特定类继承的模型)。

https://gist.github.com/4633211

(与Steve解决方案相比,它还使用命名空间模型)