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_transitionObject

Returns the value of attribute pending_transition.



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

def pending_transition
  @pending_transition
end

#uncommitted_transitionsObject

Returns the value of attribute uncommitted_transitions.



61
62
63
# File 'lib/state_manager/adapters/active_record.rb', line 61

def uncommitted_transitions
  @uncommitted_transitions
end

Class Method Details

.included(base) ⇒ Object



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

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_commitObject



105
106
107
108
109
110
111
# File 'lib/state_manager/adapters/active_record.rb', line 105

def after_commit
  transitions = self.uncommitted_transitions.dup

  self.uncommitted_transitions.clear

  transitions.each{ |t| run_commit_callbacks(*t) }
end

#after_saveObject



95
96
97
98
99
100
101
102
103
# File 'lib/state_manager/adapters/active_record.rb', line 95

def after_save
  return unless pending_transition
  transition = pending_transition

  self.uncommitted_transitions << self.pending_transition
  self.pending_transition = nil

  _run_after_callbacks(*transition)
end

#before_saveObject



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

def before_save
  return unless pending_transition
  _run_before_callbacks(*pending_transition)
end

#initializeObject



80
81
82
83
# File 'lib/state_manager/adapters/active_record.rb', line 80

def initialize(*)
  super
  self.uncommitted_transitions = []
end

#perform_initial_transition?Boolean

Returns:

  • (Boolean)


126
127
128
# File 'lib/state_manager/adapters/active_record.rb', line 126

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

#persist_stateObject



122
123
124
# File 'lib/state_manager/adapters/active_record.rb', line 122

def persist_state
  resource.save!
end

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



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

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:



85
86
87
88
# File 'lib/state_manager/adapters/active_record.rb', line 85

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



118
119
120
# File 'lib/state_manager/adapters/active_record.rb', line 118

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