2012-02-07 2 views
2

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

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

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

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

ответ

1

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

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

+0

Это определенно меньше, чем идеальное, но в конечном итоге я использовал это решение. Спасибо. – Max

1
TheModel.subclasses 

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

0

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

Внутри Турнир модели:

def validate_type_implemented 
    klass = type.constantize rescue Object 
    raise "Given type not available." unless klass.class == Class and klass <= self.class 
end 
Смежные вопросы