Для конечного автомата позвольте мне предложить еще один: рабочий процесс
Причина, по которой все гемы используют «предопределенные» состояния, заключается в том, что обычно с состояниями связан некоторый код ruby: вы говорите такие вещи, как «когда происходит переход из этого состояния в это состояние, выполняйте этот код» или «перед тем, как переходя отсюда туда, проверь этот рубиновый охранник ". Такая функциональность не может быть реализована, если состояния не являются несколько «жестко закодированными».
Если вам просто нужно текстовое поле без какого-либо выполнения кода, вы можете просто использовать простую модель «State», содержащую:
- Имя (строка)
- идентификатор_пользователя, который создал это состояние (или идентификатор_группы, если вы используете что-то более сложное)
- Модель, для которой это состояние. Это может быть целое число или строка, в зависимости от ваших вкусов.
- Состояние parent_id (может быть нулевым). Как правило, acts_as_tree поможет вам в этом.
Предполагая, что вы используете user_id и строку для модели, раскрывающийся список состояний для электронного письма будет выглядеть следующим образом:
@states = State.find(:conditions => {
:user_id => current_user.id,
:model_name => 'State',
:parent_id => 4 #so you get the possible states that follow "New"
})
Если вам do необходимо выполнить какой-то код при переходе / защите, вам нужно будет использовать предопределенные состояния. Это также возможно, но вам придется немного изменить свои требования: вместо того, чтобы позволять пользователям определять свои собственные состояния, вы оставляете им «активировать» некоторые из них из списка. Тогда «пользователь активировал это состояние» будет просто еще одним «стражем» в вашей системе состояний.
РЕДАКТИРОВАТЬ: добавлены ссылки parent_id и acts_as_tree