10
11
12
13
14
15
16
17
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
|
# File 'lib/acts_as_statused.rb', line 10
def acts_as_statused(options = {}, &extension)
begin
return if self.included_modules.include?(ActiveRecord::Acts::Statused::ActMethods)
send :include, ActiveRecord::Acts::Statused::ActMethods
valid_status = []
valid_statuses = options[:only] if options.is_a?(Hash)
class_name = options.to_s if options.is_a?(Symbol) || options.is_a?(String)
class_name = options[:class_name] if options.is_a?(Hash)
class_name = "Status" if class_name.blank?
column_name = :status_id
column_name = (options[:column_name] || :status_id).to_sym if options.is_a?(Hash)
class_eval do
eval("belongs_to :status, :class_name => \"#{class_name}\"")
attr_accessor :previous_status
eval %{
def after_find
self.previous_status = self.status if respond_to?(:#{column_name})
end
def status
#{class_name}.get(self.#{column_name})
end
}
def has_status_changed?
return self.previous_status != self.status
end
begin
rows = eval "#{class_name}.find(:all)"
rows.each do |status| next unless valid_statuses.blank? || valid_statuses.include?(status.name)
define_method("status_is_#{status.name}?") do return self.status_id == status.id
end
end
rescue
end
end
%w{save update create destroy}.each do |verb|
define_method("before_#{verb}_status_changed") do
end
define_method("after_#{verb}_status_changed") do
end
define_method("do_before_#{verb}_status_changed") do
eval %{before_#{verb}_status_changed if self.has_status_changed?}
end
define_method("do_after_#{verb}_status_changed") do
eval %{after_#{verb}_status_changed if self.has_status_changed?}
end
eval %{
before_#{verb} :do_before_#{verb}_status_changed
after_#{verb} :do_after_#{verb}_status_changed
}
end
rescue => ex
end
end
|