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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
# File 'lib/status-manager.rb', line 25
def register_status_sets(status_attribute, status_sets)
fail 'Not defined statuses' if status_sets.empty?
if status_sets.instance_of?(Array)
status_hash = {}
status_sets.each do |status_set|
status_hash[status_set] = status_set.to_s
end
status_sets = status_hash
end
status_store = StatusStore.new(status_attribute, status_sets)
status_store_list.add(status_store)
scope("#{status_store.attribute_name}",
-> (statuses) { where("#{table_name}.#{status_store.attribute_name}" => status_store.values(statuses)) })
status_store.status_sets.each do |key, value|
scope("#{status_store.attribute_name}_#{key}",
-> { where("#{table_name}.#{status_store.attribute_name}" => value) })
define_method "#{status_store.attribute_name}_#{key}?" do
send("#{status_store.attribute_name}") == value
end
define_method "#{status_store.attribute_name}_was_#{key}?" do
send("#{status_store.attribute_name}_was") == value
end
define_method "update_#{status_store.attribute_name}_to_#{key}" do
update_attributes("#{status_store.attribute_name}" => "#{value}")
end
define_method "#{status_store.attribute_name}_to_#{key}" do
send("#{status_store.attribute_name}=", value)
end
end
define_method "#{status_store.attribute_name}?" do |status|
send("#{status_store.attribute_name}_#{status}?")
end
define_method "#{status_store.attribute_name}_was?" do |status|
send("#{status_store.attribute_name}_was_#{status}?")
end
define_method "#{status_store.attribute_name}_to" do |status|
fail "#{status} is undefined status or it is group status" unless status_store.status?(status)
status_value = self.class.status_store_list.get(status_store.attribute_name).value(status)
send("#{status_store.attribute_name}=", status_value)
end
define_method "update_#{status_store.attribute_name}_to" do |status|
fail "#{status} is undefined status or it is group status" unless status_store.status?(status)
update_attributes(status_attribute.to_sym => self.class.status_store_list.get(status_store.attribute_name).value(status))
end
define_method("#{status_store.attribute_name}_changed?") do |options = {}|
statuses = send("#{status_store.attribute_name}_change")
if statuses
if statuses[0] == statuses[1]
return false
elsif options[:from] && options[:to]
send("#{status_store.attribute_name}_was?", options[:from]) && send("#{status_store.attribute_name}?", options[:to])
elsif options[:to]
send("#{status_store.attribute_name}?", options[:to])
elsif options[:from]
send("#{status_store.attribute_name}_was?", options[:from])
else
return true
end
else
return false
end
end
define_singleton_method "#{status_store.attribute_name.to_s.pluralize}" do
status_store_list.get(status_store.attribute_name).status_sets
end
end
|