Когда модули, включенные в класс Ruby, работают в рельсах? - PullRequest
2 голосов
/ 20 августа 2010

Я пытаюсь написать метод, который сообщает мне каждый класс, который включает в себя определенный модуль. Это выглядит так -

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 голосов
/ 20 августа 2010

Они включаются, когда оператор include выполняется, когда класс определен. Rails автоматически загружает модули / классы при первом их использовании. Кроме того, вы можете попробовать что-то вроде этого:

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

Это создаст список, поскольку классы включают модуль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...