2

特定のモジュールを含むすべてのクラスを教えてくれるメソッドを書こうとしています。このように見えます-

def Rating.rateable_objects
  rateable_objects = []
  ObjectSpace.each_object(Class) do |c|
    next unless c.include? Rateable
    rateable_objects << c
  end
  rateable_objects
end

ここで、「Rateable」は、いくつかのモデルに含まれている私のモジュールです。

私が見つけたのは、Railsコンソールを起動した後、またはサーバーを実行した直後にこのメソッドを呼び出すと、このメソッドが[]を返すことです。しかし、消費モデルの1つのインスタンスを最初にインスタンス化すると、そのモデルが結果に返されます。

では、モジュールはいつ含まれるのでしょうか?彼のアプリが起動したときよりも、プロセスの後半で推測しています。プロセスの早い段階でこの方法でこの情報を取得できない場合、これを達成する方法はありますか?

4

1 に答える 1

4

これらは、クラスが定義されているときにincludeステートメントが実行されるときに含まれます。Railsは、モジュール/クラスを最初に使用するときにそれらを自動ロードします。また、次のようなことを試してみてください。

module Rateable
  @rateable_object = []
  def self.included(klass)
    @rateable_objects << klass
  end
  def rateable_objects
    @rateable_objects
  end
end

これにより、クラスにモジュールが含まれるため、リストが作成されます。

于 2010-08-20T06:12:39.473 に答える