小编典典

有没有办法收集 Rails 应用程序中的所有模型?

all

有没有一种方法可以收集 Rails 应用程序中的所有模型?

基本上,我可以这样做: -

Models.each do |model|
  puts model.class.name
end

阅读 122

收藏
2022-06-08

共1个答案

小编典典

编辑:查看评论和其他答案。 有比这个更聪明的答案!或者尝试将其改进为社区 wiki。

模型不会将自己注册到主对象,所以不,Rails 没有模型列表。

但是您仍然可以查看应用程序的模型目录的内容…

Dir.foreach("#{RAILS_ROOT}/app/models") do |model_path|
  # ...
end

编辑:另一个(疯狂的)想法是使用 Ruby 反射来搜索扩展 ActiveRecord::Base 的每个类。不知道如何列出所有课程…

编辑:只是为了好玩,我找到了一种列出所有课程的方法

Module.constants.select { |c| (eval c).is_a? Class }

编辑:最终成功列出所有模型而不查看目录

Module.constants.select do |constant_name|
  constant = eval constant_name
  if not constant.nil? and constant.is_a? Class and constant.superclass == ActiveRecord::Base
    constant
  end
end

如果您也想处理派生类,那么您将需要测试整个超类链。我通过向 Class 类添加一个方法来做到这一点:

class Class
  def extend?(klass)
    not superclass.nil? and ( superclass == klass or superclass.extend? klass )
  end
end

def models 
  Module.constants.select do |constant_name|
    constant = eval constant_name
    if not constant.nil? and constant.is_a? Class and constant.extend? ActiveRecord::Base
    constant
    end
  end
end
2022-06-08