找到所有在我的应用程序mongoid型号名称(Find all the mongoid model

2019-09-17 17:30发布

有没有办法找出所有在我的Rails应用程序的模型Mongoid名字。 我可以通过获取里面我的应用程序/模型文件夹下所有文件中找到所有的模型,但我特别希望mongoid型号名称。

Answer 1:

如果你的模型类已经加载,那么你可以通过查找所有包含Mongoid ::文件模块的类列出。

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或子目录)



Answer 2:

您可以在Mongoid版本3.1及更高做到这一点: Mongoid.models

如果你是在模特们没有自动加载Rails的开发方式,运行Rails.application.eager_load! 加载整个应用程序。



Answer 3:

这个问题Mongoid.models是显然只返回已加载模型。 我的确在轨控制台下面的实验(我有三个型号: 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任务调用。 克里斯的解决方案正常工作,所以我想这是在这个时候最好的选择:S(我没有得到可以使用Rails工作史蒂夫的解决方案4)。



Answer 4:

这里有一个要点我编码,以获得所有Mongoid模型,并任选通过超过滤它们(比方说,如果你想只得到模型从一个特定的类继承)。

https://gist.github.com/4633211

(与史蒂夫的解决方案,它也与命名空间模型时)



文章来源: Find all the mongoid model names in my application