Когда вы используете require, даже если ваш my_model.rb
перезагружен, ядру не потребуются ваши файлы подклассов .rb
, потому что они уже были загружены. Тебе придется пройти через автозагрузку рельсов.
Обычно, по вашему первому запросу, rails автоматически загружается MyModel
из my_model.rb
, что требует my_models/sub_model.rb
. Класс SubModel
наследует MyModel
, который заполняет массив descendants
.
Однако по вашим следующим запросам rails автоматически загружается MyModel
(эй, вы находитесь в режиме разработки), что снова требует my_models/sub_model.rb
. Но на этот раз ядро знает, что оно уже загрузило этот файл и не будет загружать его снова.
Я столкнулся с этой проблемой час назад, что привело меня к вашему посту и поиску решения. Нам нужны rails для автозагрузки подклассов при каждом вызове вашего основного класса.
Вот решение:
class MyModel
Dir[File.join(File.dirname(__FILE__),"my_models","*.rb")].each do |f|
MyModels.const_get(File.basename(f,'.rb').classify)
end
end
Эти строки, вероятно, могут быть выведены за пределы класса. Этого должно быть достаточно (это для меня), если у вас есть файлы только в my_models
, а не в подкаталогах. Если у вас есть некоторые (например, MyModels::Car::Ford
, вам может потребоваться поместить такие же вещи в подмодули (в my_models/car.rb
).