Путь автозагрузки и наследование STI - PullRequest
1 голос
/ 23 октября 2010

У меня есть две модели User и Manager. Я использую STI для наследования Manager от User модели.

приложение / модели / user.rb

class User < ActiveRecord::Base

end

custom_lib / модели / manager.rb

class Manager < User

end

Я добавил пользовательские модели для загрузки пути следующим образом:

конфиг / environment.rb

config.autoload_path += File.join(RAILS_ROOT, "custom_lib", "models")

В режиме разработки все работает как положено. В производственном режиме я получаю следующую ошибку:

The single-table inheritance mechanism failed to locate the subclass: Manager

По какой-то причине rails не загружает унаследованные классы.

Чтобы обойти эту проблему, мне явно требуются классы в инициализаторе.

конфиг / Инициализаторы / custom_models.rb

Dir[File.join(RAILS_ROOT, "custom_lib", "models", "*.rb")].each do |file_name|
  require(File.join(File.dirname(file_name), File.basename(file_name, ".rb")))
end

Я предпочитаю использовать autoload_path. Мне интересно, видел ли кто-нибудь еще такое поведение.

Я на Ruby 1.8.7, Rails 2.3.9, Ubuntu

Редактировать 1

Я знаю, что все работает, если все модели находятся в каталоге app/models. В моем приложении сгенерированные модели находятся в произвольном месте, отсюда и это требование.

1 Ответ

0 голосов
/ 23 октября 2010

Храните файл manager.rb в каталоге app/models, где находится файл user.rb. Вот где рельсы ищут модели. Нет смысла скрывать модель менеджера в другом каталоге.

Как только вы это сделаете, вы также можете избавиться от взлома с помощью пути загрузки.

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