ruby-on-rails - Ruby On Rails 中的类列表

标签 ruby-on-rails ruby class activerecord mongoid

我需要列出模型文件夹中存在的所有类(如果可能的话还带有属性),我成功地通过 ActiveRecord 做到了这一点,但我找不到任何跨 ORM 和跨 DB 的解决方案。


一个例子比我的话更容易理解:

文件结构

 app
. models
.. user.rb
.. post.rb
.. comment.rb

内部文件

class User
  ...
end

class Post
  ...
end

class Comment
  ...
end

预期

[User,Post,Comment]

现有但不完整的解决方案

现在,我通过一小段代码列出了这些类

model_name = []
ActiveRecord::Base.subclasses.each do |t|
  model_name << t.name.camelize
end
model_name

问题

我正在寻找相同类型的方法,但没有 ActiveRecord。 我需要访问类列表(如果可能的话带有属性),无论 ORM 或数据库类型如何。 我考虑过解析模型的文件夹,但这对我来说似乎不是一个好的解决方案。

您对一些解决方案有什么想法吗?

最佳答案

我能想到几个攻击角度:

  1. 大多数 ORM 具有与 ActiveRecord 类似的模式,这意味着模型类需要继承(或包含)某个基类,然后您可以内省(introspection)该基类的后代(例如 Sequel::Model.decendants sequel
  2. 如果您的所有模型都在已知的Module(命名空间)下声明,您可以使用 constants 列出在特定模块下声明的类。方法

    MyModels.constants
    # => [MyModels::User,MyModels::Post,MyModels::Comment]
    
  3. 如果您可以控制类加载的时间(即它们不会自动加载),您可以在加载模型之前和之后枚举对象空间中的类,像这样的东西:

    classes_before = Set.new
    ObjectSpace.each_object do |cl| 
      classes_before << cl if cl.class == Class
    end
    Dir.glob('app/models/*.rb').each do |model|
      require model
    end
    classes_after = Set.new
    ObjectSpace.each_object do |cl| 
      classes_after << cl if cl.class == Class
    end
    model_classes = classes_after - classes_before
    
  4. 如果您知道所有模型类都是由rails idioms编写的(每个文件中只有一个类,文件名是类名的snake_case),您也可以简单地收集名称models 文件夹下的文件:

    Dir.glob('app/models/*.rb').map do |file|
      file[/app\/models\/(.*)\.rb/, 1].camelize
    end
    

关于ruby-on-rails - Ruby On Rails 中的类列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26980256/

相关文章:

ruby-on-rails - 使用 rake db :migrate does not change it 迁移数据

ruby - 大型集合的唯一排列

python - 使用 Python GUI (PySide) 元素的 OOP 技术

ruby-on-rails - Rails将默认DateTime设置为now

ruby-on-rails - Rails Controller 创建 Model.new 和 Model.create 之间的 Action 差异

ruby-on-rails - rails 5 carrierwave 没有路由匹配图像

ruby - 在 Ruby 中的 HTTP 服务器(Sinatra Stream)中建立 WebSocket 连接

ruby - 如何在 Slim lang Template Engine for Ruby 中选择 Select Option?

php - 在 PHP 中保存函数的类变量

c++ - 从另一个成员函数的实现中调用成员函数