У меня есть простое приложение rails с проектами и фазами моделей. У проекта много фаз, но только одна фаза может быть активной (то есть «текущей») единовременно. Я по-прежнему хочу, чтобы другие фазы были доступны, но текущая фаза должна быть основным якорем для приложения. Решение о том, как реализовать это требование, имеет большое значение для того, как я обрабатываю доступ к модели, проверки и представления / формы для обновления создания.
Итак, вопрос: как мне достичь этого "has_many, но has-only-one-current" ассоциация », не добавляя лишней сложности? Основные цели: простота доступа к текущей фазе + гарантия того, что одновременно не может быть более одной активной фазы.
Естественно, я сам подумал и предложил три варианта, которые я хочу здесь представить. Приветствуются любые отзывы о том, почему мне следует выбрать один вариант вместо другого (или предложение более простого решения):
Первый вариант:
[Project] has_many :phases
[Project] has_one :current_phase, :class_name => "Phase", :conditions => { :current => true }
Недостаток: у меня есть вложенная форма для создания проектов и соответствующих фаз. Кажется, нет простого способа сделать активным ровно одну из вновь созданных фаз.
Второй вариант:
[Project] has an attribute "current_phase_id"
[Project] has_many :phases
[Project] belongs_to phase, :foreign_key => "current_phase_id"
Недостаток: то же, что и вариант 1, но у меня есть другой атрибут и ассоциация own_to, что кажется странным (почему проект принадлежит к одной из его фаз?)
Третий вариант:
[Phase] has an attribute "active" (boolean)
[Phase] scope :active, :conditions => { :active => true}
# Access to current phase via: project.phases.active
Недостаток: я должен гарантировать с помощью проверок, что есть только одна активная фаза за раз, что сложно, если несколько фаз создаются / редактируются в в одно и то же время ИЛИ при переключении с одной фазы на другую; plus: project.phases.active возвращает массив, если я не ошибаюсь
Ваша помощь очень ценится. Спасибо!
Добавлена награда, чтобы поощрять дальнейшие мнения по теме. Баунти будет присужден за решение, которое наилучшим образом соответствует основным целям, указанным выше; или, если альтернативное решение не упомянуто, к ответу, который лучше всего объясняет, почему я должен отдавать предпочтение одному из данных вариантов перед другим. Спасибо!