2

私は2つの簡単なタスクを実行する方法を決定しようとしています:

  1. ジェムのコンテキストからすべてのRailsアプリのモデルをロードしたいと思います。たとえば、Railsアプリケーションがブログであり、作成者、投稿、コメントがあるとします。含まれている宝石に、それらが存在することを知らずに、それらのモデルを見つけてもらいたいと思います。

  2. 繰り返しになりますが、ロードされた宝石のコンテキストから、レールモデルを利用できるようにしたいと思います。したがって、たとえば、作成者が存在することを知らなくても、Author.firstを呼び出すことができ、その情報を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タックしますconstantizecamelize

キャメライズドキュメント

ドキュメントを一定化する

于 2013-02-03T06:21:08.920 に答える