2013-11-07 2 views
18

Я хотел бы иметь возможность загружать все приложение, чтобы я мог найти потомков данного класса.Рельсы модели с сильной нагрузкой

Для примера, приведенного я следующий класс, определенный:

# app/models/foo_class.rb 
class FooClass < MySpecialBaseClass 
    # pasta code 
end 

Это не будет найдено с:

irb> ObjectSpace.each_object.select { |obj| obj.is_a?(Class) && obj <= MySpecialBaseClass } 
=> [] 

Пока я не называю ПОСТОЯННЫЕ:

irb> FooClass 

Тогда возвращается:

irb> ObjectSpace.each_object.select { |obj| obj.is_a?(Class) && obj <= MySpecialBaseClass } 

=> [FooClass] 

Как я могу это сделать?

+0

Этот вопрос, кажется, был [имя уже] (http://stackoverflow.com/questions/2393697/look-up-all-descendants-of-a-class-in-ruby). Это не работает для вас? – PinnyM

+1

Это, по сути, то, что я делаю, но это не касается проблемы автозагрузки. –

ответ

30

Ну, после некоторого копания, это на самом деле очень просто. Просто нужно запустить следующее.

Rails.application.eager_load! 
+3

Можно ли поместить это в файл конфигурации так, чтобы он вызывается после инициализации приложения Rails. Где бы вы это выразили? – TheJKFever

+0

Хотелось бы также знать: где в исходном дереве идет этот маленький фрагмент? –

+0

Вы можете поместить 'config.after_initialize {eager_load! } 'в вашем * application.rb *, однако это не перезагружает класс при вызове' reload! 'на консоли. –

7

От Configuring Rails Applications

  1. config.eager_load когда истинные Нетерпеливые нагрузки всех зарегистрированных config.eager_load_namespaces. Это включает в себя ваше приложение, двигателей, Rails-фреймворки и любое другое зарегистрированное пространство имен.
  2. config.eager_load_namespaces регистрирует пространства имен, которые нетерпеливы загружается, когда config.eager_load истинно. Все пространства имен в списке должны отвечать на eager_load! метод.
  3. config.eager_load_paths принимает массив путей, из которых Rails будет загружать загрузку, если классы кэша включены. По умолчанию используется каждая папка в каталоге приложения приложения.

EDIT:

Чтобы вручную загрузить вы должны быть в состоянии сделать что-то вроде:

matcher = /\A#{Regexp.escape(load_path)}\/(.*)\.rb\Z/ 
Dir.glob("#{load_path}/**/*.rb").sort.each do |file| 
    require_dependency file.sub(matcher, '\1') 
end 
+0

Несомненно, я знаю, как это сделать в конфигурации, но как насчет вручную? –

Смежные вопросы