Я пытаюсь найти лучший способ спроектировать модель рельсов.Для примера предположим, что я создаю базу данных символов, которая может иметь несколько разных фиксированных атрибутов.Например:
Character
- Morality (may be "Good" or "Evil")
- Genre (may be "Action", "Suspense", or "Western")
- Hair Color (may be "Blond", "Brown", or "Black")
... и т. Д.
Итак, для модели персонажа есть несколько атрибутов, в которых я хочу иметь фиксированный список возможных выборов.
Я хочу, чтобы пользователи могли создавать персонажей, и в форме я хочу, чтобы они выбирали одного из каждого из доступных вариантов.Я также хочу, чтобы пользователи могли выполнять поиск с использованием каждого из этих атрибутов ... (т. Е. «Показывать мне« хороших »персонажей из жанра« Suspense »и с коричневыми волосами).
Я могу придумать пару способов сделать это ...
1: создать строку для каждого атрибута и проверить ограниченный ввод.
Вв этом случае я бы определил строковый столбец «Мораль» в таблице символов, затем имел бы константу класса с указанными в ней параметрами и затем проверил ее по этой константе класса.
Поиск хороших символов будет выглядеть как Character.where(:morality=>'Good')
.
Это хорошо и просто, недостатком является то, что если я захочу добавить некоторые подробности к атрибуту, например, чтобы было описание "Good" и "Evil", и страницу, на которой пользователи могли быпросмотреть все символы для данной морали.
2: создать модель для каждого атрибута
В этом случае Character belongs_to Morality
, будет модель Morality
и moralities
таблица с двумя записями в ней: Morality id:1, name:Good
и т. д.
Поиск хороших символов будет выглядеть как Morality.find_by_name('Good').characters
... или Character.where(:morality=> Morality.find(1)
.
Это работает нормально, но это означает, что у вас есть несколько таблиц, которые существуют только для хранения небольшого числа предопределенных атрибутов.
3: Создать модель STI для атрибутов
В этом случае я мог бы сделать то же самое, что и # 2, за исключением создания общей таблицы "CharacterAttributes" и затем подкласса.это для "MoralityAttribute", "GenreAttribute" и т. д. Это делает только одну таблицу для многих атрибутов, в противном случае она выглядит примерно так же, как идея # 2.
Итак, вот три способа, которыми я могуПодумайте, чтобы решить эту проблему.
Мой вопрос: как бы вы это реализовали и почему?
Вы бы использовали один из подходов, приведенных выше, и если да, токоторый из?Вы бы сделали что-то другое?Мне было бы особенно интересно услышать соображения по поводу эффективности вашего подхода.Я знаю, что это широкий вопрос, спасибо за любой вклад.
РЕДАКТИРОВАТЬ: Я добавляю вознаграждение 250 (более 10% моей репутации !!) по этому вопросупотому что я мог бы действительно использовать более расширенное обсуждение плюсов / минусов / вариантов.Я буду отдавать голоса тем, кто взвешивает что-то конструктивное, и если кто-то может дать мне действительно убедительный пример того, какой подход они используют и ПОЧЕМУ это будет стоить + 250.
Я действительно мучаюсьнад дизайном этого аспекта моего приложения, и теперь пришло время его реализовать.Заранее благодарим за любую полезную дискуссию !!
ЗАКЛЮЧИТЕЛЬНОЕ ПРИМЕЧАНИЕ:
Спасибо всем за вдумчивые и интересные ответы, все они хороши и былиочень полезно для меня.В конце (входящий прямо перед истечением срока действия награды!) Я действительно оценил ответ Blackbird07.В то время как все предлагали хорошие предложения, лично для меня он был самым полезным.Я действительно не знал об идее перечисления прежде, и с тех пор, как я изучил его, я обнаружил, что он решает многие проблемы, с которыми я столкнулся в своем приложении.Я призываю всех, кто узнает об этом вопросе, прочитать все ответы, есть много хороших подходов.