【问题标题】:get a list of all models from rails [duplicate]从rails获取所有模型的列表[重复]
【发布时间】:2010-11-17 01:10:37
【问题描述】:

我需要一个包含所有模型(class_names)的列表,这些模型末尾带有“Cube”模式。

示例:

我所有的模型: ModelFoo、ModelBar、ModelBarCube、Mode2BarCube

我需要什么:

['ModelBarCube', 'Mode2BarCube']

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    因为除非需要,Rails 不会加载类,因此您必须从文件夹中读取模型。这是代码

    Dir.glob(Rails.root + '/app/models/*.rb').each { |file| require file }
      @models = Object.subclasses_of(ActiveRecord::Base).select { |model| 
       model.name[-4..-1] == "Cube"
      } 
    

    【讨论】:

    • 此代码适用于我,但有时我在重新需要之前已经需要的模型文件时会收到警告。我能够通过使用 expand_path 来解决这个问题,请参阅 devblog.avdi.org/2009/10/22/double-load-guards-in-ruby 的底部
    • 一点更正希望大家不要介意,RAILS_ROOT 已经改成了 Rails.root
    【解决方案2】:

    在 Rails 3 中,您可以将 @models 换成:

    @models = ActiveRecord::Base.subclasses.collect { |type| type.name }.sort
    

    【讨论】:

    • ActiveRecord::Base.subclasses 已弃用,请使用#descendants
    【解决方案3】:

    对于 Rails 3

    @models = ActiveRecord::Base.
        descendants.
        select{|x| x.name[-4..-1] == "Cube"}
    

    【讨论】:

      【解决方案4】:

      我在谷歌上搜索如何显示所有 Ralis 模型的答案,这里的答案组合非常有用,谢谢。

      所以这里的解决方案组合甚至适用于 Rails 上的 STI 表

      #Since Rails doesn't load classes unless it needs them, you must read the models from the folder. Here is the code
      Dir[Rails.root.to_s + '/app/models/**/*.rb'].each do |file| 
        begin
          require file
        rescue
        end
      end
      
      models = ActiveRecord::Base.subclasses.collect { |type| type.name }.sort
      
      models.each do |model|
        print model
        print '  '
      end
      
      【解决方案5】:
      @models = ActiveRecord::Base.descendants.map(&:name)
      

      为您提供所有模型名称,这些名称要么继承自 ActiveRecord::Base,要么是任何现有模型的子类。

      【讨论】:

      • 它没有给出完整的模型列表
      猜你喜欢
      • 2012-05-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 2020-08-27
      • 2023-03-25
      • 2021-03-16
      • 2019-02-05
      • 1970-01-01
      相关资源
      最近更新 更多