2

我正在尝试确定如何执行两个简单的任务:

  1. 我想从 Gem 的上下文中加载所有 Rails 应用程序的模型。例如,假设 Rails 应用程序是一个博客,并且有作者、帖子和评论。我希望包含的 gem 在不知道它们存在的情况下找到这些模型。

  2. 同样,从加载的 gem 的上下文中,我希望我可以使用 rails 模型;例如,我可以在不知道 Authors 存在的情况下调用 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
4

1 回答 1

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

骆驼化文档

恒定化文档

于 2013-02-03T06:21:08.920 回答