有没有办法让您在Rails应用程序中收集所有模型?
基本上,我可以做以下事情吗?
Models.each do |model|
puts model.class.name
end
编辑:看评论和其他答案。有比这更聪明的答案!或尝试将其改进为社区Wiki。
模型不会将自己注册到主对象,因此,Rails没有模型列表。
但是您仍然可以查看应用程序的models目录的内容...
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句