2014-10-04 5 views
1

У меня есть объект, который имеет состояние. Это может быть:Моделирование состояний и под-состояний с использованием перечислений в рельсах

'scheduled', 'on-shift' or 'past' 

Кроме того, «на смену» может быть состояние:

'available', 'busy' or 'inactive' 

Каков наилучший способ смоделировать эти состояния в моей рельсы приложение?

Это:

a. создать два государственных признака:

1. object_state - can take the value: 'scheduled', 'on-shift' or 'past' 
2. on_shift_state - can take the value: 'available', 'busy' or 'inactive' 

b. создайте единый атрибут состояния, который может принимать значение:

'scheduled', 'past', 'available', 'busy' or 'inactive'. 

c. каким-то другим способом.

Я думаю, что вариант b обеспечит логическую согласованность в базе данных, но увеличит сложность запросов, например. если я хочу искать единицы, которые являются «в смену», мне нужно искать 3 разных состояния. Также может быть труднее расширить, например, если я хочу добавить больше состояний на более поздний срок.

Если бы я должен был пойти с опцией b, есть ли способ упростить запросы?

Какие-либо конкретные структуры/методы, которые вы бы предложили использовать?

примечание: я думаю об использовании перечислений для моделирования состояния (состояний).

ответ

1

Я бы рекомендовал использовать State Machine и хранить ваши состояния в одном атрибуте.

С помощью State Machine вам просто нужно добавить поле состояния к вашей модели, а затем вы можете определить свои состояния, используя DSL-порт Gem. State Machine будет обрабатывать логику перехода между состояниями и обеспечит хорошие геттеры и сеттеры для каждого состояния.

+0

Спасибо, я слышал хорошие вещи о драгоценности государственного аппарата, хотя я думал, что это может быть слишком тяжело для моего приложения. Любые конкретные идеи о том, как решить мою проблему с использованием драгоценного камня? Я понимаю, как определять состояния, события и переходы, но не как создавать под-состояния или группы состояний. – user3711600

Смежные вопросы