【问题标题】:Find all the mongoid model names in my application在我的应用程序中查找所有 mongoid 模型名称
【发布时间】:2012-06-02 07:08:07
【问题描述】:

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

【问题讨论】:

    标签: ruby-on-rails-3 mongoid


    【解决方案1】:

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

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

    【讨论】:

    • 我使用 Mongoid 7.3.3 Mongoid.models 不仅返回我的模型,而且还返回: Mongoid::GlobalDiscriminatorKeyAssignment::InvalidFieldHost 哪一种搞砸了。
    【解决方案2】:

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

    【讨论】:

    • 警告:Object.constants 不返回命名空间模型。
    【解决方案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 任务中调用的。 Chris 的解决方案运行良好,所以我想这是目前最好的选择:S(我无法使用 Rails 4 使用 Steve 的解决方案)。

    【讨论】:

    • 我已更新我的答案以包括 Rails.application.eager_load! 这将解决您描述的问题。
    【解决方案4】:

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

    https://gist.github.com/4633211

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 2022-07-22
      • 2013-05-13
      • 2011-06-09
      相关资源
      最近更新 更多