Module: StateManager::Adapters::ActiveRecord::ManagerMethods

Defined in:
lib/state_manager/adapters/active_record.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#pending_transition ⇒ Object

Returns the value of attribute pending_transition.



58
59
60
# File 'lib/state_manager/adapters/active_record.rb', line 58

def pending_transition
  @pending_transition
end

#uncommitted_transitions ⇒ Object

Returns the value of attribute uncommitted_transitions.



59
60
61
# File 'lib/state_manager/adapters/active_record.rb', line 59

def uncommitted_transitions
  @uncommitted_transitions
end

Class Method Details

.included(base) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/state_manager/adapters/active_record.rb', line 61

def self.included(base)
  base.class_eval do
    alias_method :_run_before_callbacks, :run_before_callbacks
    alias_method :_run_after_callbacks, :run_after_callbacks

    # In the AR use case, we don't want to run any callbacks
    # until the model has been saved
    def run_before_callbacks(*args)
      self.pending_transition = args
    end

    def run_after_callbacks(*args)
    end
  end
end

Instance Method Details

#after_commit ⇒ Object



95
96
97
98
# File 'lib/state_manager/adapters/active_record.rb', line 95

def after_commit
  self.uncommitted_transitions.each{ |t| run_commit_callbacks(*t) }
  self.uncommitted_transitions.clear
end

#after_save ⇒ Object



87
88
89
90
91
92
93
# File 'lib/state_manager/adapters/active_record.rb', line 87

def after_save
  return unless pending_transition
  _run_after_callbacks(*pending_transition)
  self.uncommitted_transitions ||= []
  self.uncommitted_transitions << self.pending_transition
  self.pending_transition = nil
end

#before_save ⇒ Object



82
83
84
85
# File 'lib/state_manager/adapters/active_record.rb', line 82

def before_save
  return unless pending_transition
  _run_before_callbacks(*pending_transition)
end

#perform_initial_transition? ⇒ Boolean

Returns:

  • (Boolean)


113
114
115
# File 'lib/state_manager/adapters/active_record.rb', line 113

def perform_initial_transition?
  !current_state || resource.new_record?
end

#persist_state ⇒ Object



109
110
111
# File 'lib/state_manager/adapters/active_record.rb', line 109

def persist_state
  resource.save
end

#run_commit_callbacks(from_state, to_state, current_event, enter_states, exit_states) ⇒ Object



100
101
102
103
# File 'lib/state_manager/adapters/active_record.rb', line 100

def run_commit_callbacks(from_state, to_state, current_event, enter_states, exit_states)
  exit_states.each{ |s| s.exit_committed if s.respond_to? :exit_committed }
  enter_states.each{ |s| s.enter_committed if s.respond_to? :enter_committed }
end

#transition_to(*args) ⇒ Object

Raises:



77
78
79
80
# File 'lib/state_manager/adapters/active_record.rb', line 77

def transition_to(*args)
  raise(DirtyTransition, "Only one state transition may be performed before saving a record. This error could be caused by the record being initialized to a default state.") if pending_transition
  super
end

#write_state(value) ⇒ Object



105
106
107
# File 'lib/state_manager/adapters/active_record.rb', line 105

def write_state(value)
  resource.send :write_attribute, self.class._state_property, value.path
end