Как правильно проверить тип при использовании наследования одной таблицы (STI)? - PullRequest
2 голосов
/ 08 февраля 2012

Я пытаюсь использовать наследование одной таблицы для некоторых из моих моделей.Базовая модель - Турнир, и я хочу расширить ее, чтобы создавать турниры разных типов.Например, я мог бы хотеть добавить SingleEliminationTournament или DoubleEliminationTournament, оба из которых унаследованы от Tournament.У меня есть 2 вопроса, оба они в некоторой степени связаны.

1) Я бы хотел, чтобы пользователь мог создавать турниры с формой, и для этого ему нужно было бы выбрать один из подклассов.Есть ли способ получить все подклассы и использовать их для заполнения поля выбора или что-то в этом роде?

2) Поскольку эта информация входит в форму, было бы неплохо иметь возможность проверитьввод в тип.Чтобы сделать это, я хотел бы добавить проверку в классе Турнира, которая могла бы проверить, чтобы убедиться, что Тип действителен.

Очевидно, я мог бы жестко закодировать значения в проверку и форму, но я бы хотелне нравится делать это.Любая помощь будет оценена.Спасибо!

Ответы [ 3 ]

1 голос
/ 27 апреля 2012
TheModel.subclasses 

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

1 голос
/ 08 февраля 2012

Вы можете создать каталог с турнирами в них и загрузить их с Dir.glob('app/tournaments/**/*_tournament.rb').Это дает вам хороший список всех турниров файлов , которые вы указали.Из-за соглашения вы можете затем определить правильное имя класса для каждого турнира.

Сохраните этот список названий турниров где-нибудь для справки в ваших валидациях и формах.

0 голосов
/ 27 марта 2014

Я не эксперт по Rails, и я не уверен, что это можно считать чистым, но для части проверки вашего вопроса это сработало для меня:

Модель внутри турнира:

def validate_type_implemented
  klass = type.constantize rescue Object
  raise "Given type not available." unless klass.class == Class and klass <= self.class
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...