我想在模型中存储一个状态,并且可以从一个状态更改为任何其他状态。状态列表在模型中预定义。
状态机对我来说太过分了,因为我不需要状态之间的事件/转换,也不想写N平方转换(允许任何状态转移到任何其他状态)。 / p>
这样做有很好的Rails宝石吗?我想避免自己编写所有常量/访问器/检查有效性。
答案 0 :(得分:2)
宝石对于这种功能来说太过分了。
class Model < ActiveRecord::Base
# validation
validate :state_is_in_list
# All the possible states
STATUS = %w{foo bar zoo loo}
# method to change to a state. !! Not sure if this is the right syntax
STATUS.each do |state|
define_method "#{state}!" do
write_attribute :state, state
end
# Also ? methods are handy for conditions
define_method "#{state}?" do
state == read_attribute(:state)
end
end
# So you can do model.bar! and it will change state to 'bar'
# And model.bar? will return true if it is in 'bar' state
private
def child_and_team_code_exists
errors.add(:state, 'Not a valid state') unless STATUS.include? state
end
end
答案 1 :(得分:0)
我发现要搜索的正确关键字应为'Active Record Enumeration'
我选择了第二个名为enumerize的人。它提供了很好的API和良好的表单输入生成器。它还有一个简单的范围和访问器。