18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
# File 'lib/state_tracking.rb', line 18
def state_tracking(options={}, &block)
aasm(column: :state, &block)
aasm.states.each do |state|
callbacks = state.options[:enter] ||= []
unless callbacks.is_a?(Array)
callbacks = state.options[:enter] = [callbacks]
end
unless callbacks.any?{|c| c.class.name == 'StateTracking::StateTrackingProc'}
callbacks << StateTrackingProc.new { |record|
record.send(:_state_tracking_record_state_change, state.name)
}
end
end
_override_aasm_events
self.send(:include, InstanceMethods)
if options[:fire_events]
@_state_tracking_fire_states = options[:fire_events] if options[:fire_events].is_a?(Array)
self.class_eval do
after_commit :_state_tracking_fire_events
def _state_tracking_fire_states
self.class.instance_variable_get(:@_state_tracking_fire_states)
end
def _state_tracking_fire_events
(@_state_tracking_events_to_fire || []).each do |state|
next if _state_tracking_fire_states &&
!_state_tracking_fire_states.include?(state.to_sym)
primary_key = self.class.primary_key
name_underscored = self.class.name.underscore
pkey_value = send(primary_key)
event_name = "#{name_underscored}_#{state}"
unless pkey_value
raise "Can't publish event (#{event_name.inspect}). " \
"Primary key (#{primary_key.inspect}) for " \
"#{self.class.name.inspect} is nil."
end
params = {
"#{name_underscored}_#{primary_key}" => pkey_value
}
Announcer.publish(event_name, params)
end
@_state_tracking_events_to_fire = nil
end
def _state_tracking_record_state_change(state)
super
(@_state_tracking_events_to_fire ||= []) << state.to_s
end
end
end
end
|