6

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

4

4 回答 4

15

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

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

于 2012-11-21T04:54:42.793 回答
14

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

于 2012-06-02T12:55:19.193 回答
4

问题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 任务中调用的。Chris 的解决方案运行良好,所以我想这是目前最好的选择:S(我无法使用 Rails 4 使用 Steve 的解决方案)。

于 2014-01-07T14:46:32.693 回答
1

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

https://gist.github.com/4633211

(与史蒂夫解决方案相比,它也适用于命名空间模型)

于 2013-01-25T10:00:16.333 回答