Каков «путь рельсов» для принудительного применения has_many, но has-only-one-current ассоциации?

У меня есть простое приложение 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 возвращает массив, если я не ошибаюсь

Ваша помощь очень ценится. Спасибо!

Обновление

Добавлена ​​награда, чтобы поощрять дальнейшие мнения по теме. Баунти будет присужден за решение, которое наилучшим образом соответствует основным целям, указанным выше; или, если альтернативное решение не упомянуто, к ответу, который лучше всего объясняет, почему я должен отдавать предпочтение одному из данных вариантов перед другим. Спасибо!

19
задан emrass 13 July 2011 в 11:24
поделиться