Module: Stateful::ActiveRecord::ClassMethods

Defined in:
lib/Stateful/ActiveRecord/ClassMethods.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.extended(klass) ⇒ Object



8
9
10
11
12
13
14
15
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 8

def extended(klass)
  klass.define_stateful_attribute_setter_method
  klass.define_stateful_attribute_getter_method
  klass.define_next_state_method
  klass.define_transitions_method
  klass.define_initial_stateQ_method
  klass.define_final_stateQ_method
end

Instance Method Details

#define_stateful_attribute_getter_method(machine_name: nil) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 44

def define_stateful_attribute_getter_method(machine_name: nil)
  stateful_column_name = stateful_attribute_name_for_machine(machine_name)
  define_method(stateful_column_name) do
    instance_variable_set("@#{stateful_column_name}", self.class.stateful_state_machine(machine_name).find(read_attribute(stateful_column_name)))
    if state = instance_variable_get("@#{stateful_column_name}")
      state
    else
      initial_state = self.class.stateful_state_machine(machine_name).initial_state
      self.send("#{stateful_column_name}=", initial_state.name)
      initial_state
    end
  end
end

#define_stateful_attribute_setter_method(machine_name: nil) ⇒ Object



34
35
36
37
38
39
40
41
42
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 34

def define_stateful_attribute_setter_method(machine_name: nil)
  stateful_column_name = stateful_attribute_name_for_machine(machine_name)
  define_method("#{stateful_column_name}=") do |state|
    instance_variable_set("@#{stateful_column_name}", self.class.stateful_state_machine(machine_name).find(state))
    write_attribute(stateful_column_name, instance_variable_get("@#{stateful_column_name}").name)
    self.save
    instance_variable_get("@#{stateful_column_name}")
  end
end

#stateful_attribute_name_for_machine(machine_name = nil) ⇒ Object



26
27
28
29
30
31
32
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 26

def stateful_attribute_name_for_machine(machine_name = nil)
  if machine_name
    "#{machine_name}_state"
  else
    instance_variable_get(:@stateful_column_name)
  end
end

#stateful_column_nameObject



22
23
24
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 22

def stateful_column_name
  @stateful_column_name
end

#stateful_column_name=(stateful_column_name) ⇒ Object

class << self



18
19
20
# File 'lib/Stateful/ActiveRecord/ClassMethods.rb', line 18

def stateful_column_name=(stateful_column_name)
  @stateful_column_name = stateful_column_name
end