我正在尝试确定如何完成两个简单的任务:
我想从Gem的上下文加载所有Rails应用程序的模型。例如,说Rails应用程序是一个博客,有作者,帖子和评论。我希望包含的宝石在不知道它们存在的情况下找到那些模型。
同样,从加载宝石的上下文中,我想让我可以使用导轨模型;因此,例如,我可以在不知道作者存在的情况下调用Author.first,并且我希望将该信息提供给gem。
总结这个问题。 从gem的上下文中,如何加载rails项目的所有模型,并且可以访问这些模型?
这是我的快攻:
module ActiveTest
class Base
def listme
::ActiveRecord::Base.subclasses.collect { |type| type.name }.sort
end
end
end
1.9.3-p286 :005 > a = ActiveTest::Base.new
=> #<ActiveTest::Base:0x007f8882bdd460>
1.9.3-p286 :006 > a.listme
NameError: uninitialized constant ActiveRecord
答案 0 :(得分:4)
使用ActiveSupport
models = Dir["#{Rails.root}/app/models/**/*.rb"].map do |f|
f.chomp('.rb').camelize # works with namespaces e.g. Foo::Bar::MyClass
end
如果您想将这些字符串转换为实际的Class
个对象,请在constantize
camelize