Report abuse

module WriteState
  # Writes <tt>state</tt> to the state column and persists it to the database
  # using update_attribute (which bypasses validation)
  #
  #   foo = Foo.find(1)
  #   foo.aasm_current_state # => :opened
  #   foo.close!
  #   foo.aasm_current_state # => :closed
  #   Foo.find(1).aasm_current_state # => :closed
  #
  # NOTE: intended to be called from an event

  def aasm_write_state(state)
    old_value = read_attribute(self.class.aasm_column)
    write_attribute(self.class.aasm_column, state.to_s)

    unless self.save(false)
      write_attribute(self.class.aasm_column, old_value)
      return false
    end

    true
  end
end