Я пытаюсь найти лучший способ разработки модели рельсов. В качестве примера предположим, что я строю базу данных символов, которая может иметь несколько разных фиксированных атрибутов. Например:
Character
- Morality (may be "Good" or "Evil")
- Genre (may be "Action", "Suspense", or "Western")
- Hair Color (may be "Blond", "Brown", or "Black")
... и т.д.
Итак, для модели Character есть несколько атрибутов, в которых я хочу в основном иметь фиксированный список возможных выборов.
Я хочу, чтобы пользователи могли создавать символ, и в форме я хочу, чтобы они выбирали один из каждого из доступных параметров. Я также хочу, чтобы пользователи могли искать каждый из этих атрибутов... (т.е. "Покажите мне персонажи, которые являются" хорошими ", из жанра" Suspense "и имеют" коричневые "волосы).
Я могу придумать пару способов сделать это...
1: Создайте строку для каждого атрибута и подтвердите ограниченный ввод.
В этом случае я бы определил строковый столбец "Моральность" в таблице символов, затем сохранил константу класса с указанными в ней опциями, а затем проверил бы против этой константы класса.
Поиск хороших символов будет выглядеть как Character.where(:morality=>'Good')
.
Это приятно и просто, недостатком является то, что я хотел бы добавить в атрибут более подробную информацию, например, для описания "Хорошего" и "Злого" и страницы, где пользователи могли бы просматривать все символы для данной морали.
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.
Итак, это три способа, которые я могу придумать для решения этой проблемы.
Мой вопрос: как бы вы это реализовали и почему?
Вы бы использовали один из подходов выше, и если да, то какой? Вы сделали бы что-то другое? Мне было бы особенно интересно услышать соображения производительности для подхода, который вы бы предприняли. Я знаю, что это широкий вопрос, спасибо за любой вклад.
EDIT: Я добавляю Bounty 250 (более 10% от моей репутации!!) по этому вопросу, потому что я действительно мог бы использовать более расширенное обсуждение опций/против/вариантов. Я дам upvotes всем, кто весит с чем-то конструктивным, и если кто-то может дать мне действительно солидный пример того, какой подход они берут, и ПОЧЕМУ он будет стоить +250.
Я действительно мучительно отношусь к дизайну этого аспекта моего приложения, и теперь пришло время его реализовать. Заранее благодарим за полезное обсуждение!
ЗАКЛЮЧИТЕЛЬНОЕ ПРИМЕЧАНИЕ:
Спасибо всем за ваши продуманные и интересные ответы, все они хороши и были очень полезны для меня. В конце концов (пришло прямо перед тем, как щедрость истекло!) Я действительно оценил ответ Blackbird07. Хотя все предлагали хорошие предложения, для меня лично он был самым полезным. Раньше я не знал об идее перечисления, и, глядя в него, я нахожу, что он решает многие проблемы, которые у меня возникают в моем приложении. Я бы призвал всех, кто обнаруживает этот вопрос, прочитать все ответы, есть много хороших подходов.