如何从gem的上下文列出Rails项目中的所有模型?

时间:2013-02-03 05:53:24

标签: ruby-on-rails ruby gem

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

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

  2. 同样,从加载宝石的上下文中,我想让我可以使用导轨模型;因此,例如,我可以在不知道作者存在的情况下调用Author.first,并且我希望将该信息提供给gem。

  3. 总结这个问题。 从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
    

1 个答案:

答案 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

camelize docs

constantize docs