有没有办法找出所有在我的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
是显然只返回已加载模型。 我的确在轨控制台下面的实验(我有三个型号: 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任务调用。 克里斯的解决方案正常工作,所以我想这是在这个时候最好的选择:S(我没有得到可以使用Rails工作史蒂夫的解决方案4)。
Answer 4:
这里有一个要点我编码,以获得所有Mongoid模型,并任选通过超过滤它们(比方说,如果你想只得到模型从一个特定的类继承)。
https://gist.github.com/4633211
(与史蒂夫的解决方案,它也与命名空间模型时)
文章来源: Find all the mongoid model names in my application