没有事件管理国家的宝石

时间:2012-12-26 03:38:37

标签: ruby-on-rails ruby gem

我想在模型中存储一个状态,并且可以从一个状态更改为任何其他状态。状态列表在模型中预定义。

状态机对我来说太过分了,因为我不需要状态之间的事件/转换,也不想写N平方转换(允许任何状态转移到任何其他状态)。 / p>

这样做有很好的Rails宝石吗?我想避免自己编写所有常量/访问器/检查有效性。

2 个答案:

答案 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和良好的表单输入生成器。它还有一个简单的范围和访问器。