我需要列出模型文件夹中存在的所有类(如果可能的话还带有属性),我成功地通过 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 或数据库类型如何。 我考虑过解析模型的文件夹,但这对我来说似乎不是一个好的解决方案。
您对一些解决方案有什么想法吗?
最佳答案
我能想到几个攻击角度:
- 大多数 ORM 具有与 ActiveRecord 类似的模式,这意味着模型类需要继承(或包含)某个基类,然后您可以内省(introspection)该基类的后代(例如
Sequel::Model.decendants
sequel 如果您的所有模型都在已知的
Module
(命名空间)下声明,您可以使用constants
列出在特定模块下声明的类。方法MyModels.constants # => [MyModels::User,MyModels::Post,MyModels::Comment]
如果您可以控制类加载的时间(即它们不会自动加载),您可以在加载模型之前和之后枚举对象空间中的类,像这样的东西:
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
如果您知道所有模型类都是由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/