我正在使用RoR构建一个Web应用程序,它有各种模型。每个模型都有各种状态,例如:
用户 - 由管理员批准,由政府批准,拒绝,暂停,列入黑名单,所有者,租客
列车,隐藏,批准,拒绝,暂停。
我想知道处理各种状态的最佳方法是什么,其中一些状态是相互排斥的,有些状态可以共存。
我知道我们可以使用'state_machine'gem。但我想知道是否有任何行业最佳实践。
由于
答案 0 :(得分:2)
我想知道处理各种状态的最佳方法是什么 有些州是相互排斥的,有些州可以共存。
如果出现这种情况,请考虑以具有多个状态列的方式构建模型。即在您的示例中,我可以想到用户 州(由管理员批准,政府批准,拒绝,暂停,列入黑名单)和类型(所有者,租客)。
关于管理状态和州之间的不同转换,我建议您查看workflow gem。非常灵活,清洁和智能的管理状态方法。
答案 1 :(得分:1)
我同意@thaold关于用户状态和类型之间的区别。小心地将实际上彼此独立的属性混合在一起(共存是一个警告标志) - 以后很难将它们解开,特别是当它们被一起编入一个列表时。
如果您不需要/想要一个完整的状态机gem,我通常将它们作为常量放在模块中。
class User
module State
APPROVED_BY_ADMIN = 'approved_by_admin'.freeze
APPROVED_BY_GOVERNMENT = 'approved_by_government'.freeze
# ...
end
module LivingSituation
OWNER = 'owner'.freeze
RENTER = 'renter'.freeze
end
end
class Car
module State
LISTED = 'listed'.freeze
# ...
end
end
如果您希望轻松复制Car::State.constants
等状态机库的某些部分,则对它们进行封装后,可以在Car#listed?
上进行元编程。