2014-10-04 88 views
1

我有一个有状态的对象。这可以是:“上移”在rails中使用枚举建模状态和子状态

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

此外,可状态:

'available', 'busy' or 'inactive' 

什么是在我的Rails应用程序,这些国家建立最佳方式是什么?

是不是:

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将确保数据库中的逻辑一致性,但会增加查询的复杂性,例如,如果我想要搜索'on-shift'的单元,我需要搜索3种不同的状态。它也可能更难以延伸,例如如果我想在以后添加更多的州。

如果我选择b,有没有简化查询的方法?

你会建议使用任何特定的结构/方法?

注:我想使用枚举来模拟状态。

回答

1

我会推荐使用State Machine并将您的状态存储在单个属性中。

使用状态机,您只需将状态字段添加到模型中,然后您可以使用gem的DSL定义状态。状态机将处理状态之间转换的逻辑,并将为每个状态提供很好的getter和setter。

+0

谢谢,我听说过关于状态机的好东西,尽管我认为它可能对我的应用程序来说太重了。关于如何使用宝石解决我的问题的任何具体想法?我了解如何定义状态,事件和转换,但不知道如何创建子状态或状态组。 – user3711600 2014-10-04 14:03:30