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
91
|
# File 'lib/status-manager.rb', line 17
def attr_as_status (status_attribute, status_sets={})
status_store = StatusStore.new(status_attribute, status_sets)
status_store_list.add(status_store)
scope "#{status_store.attribute_name}", lambda{ | statuses | where("#{self.table_name}.#{status_store.attribute_name.to_s}" => status_store.values(statuses)) }
status_store.status_sets.each do |key, value|
scope "#{status_store.attribute_name}_#{key}", where("#{self.table_name}.#{status_store.attribute_name}" => value)
define_method "#{status_store.attribute_name}_#{key}?" do
self.send("#{status_store.attribute_name}") == value
end
define_method "#{status_store.attribute_name}_was_#{key}?" do
self.send("#{status_store.attribute_name}_was") == value
end
define_method "update_#{status_store.attribute_name}_to_#{key}" do
self.update_attributes("#{status_store.attribute_name}" => "#{value}")
end
define_method "#{status_store.attribute_name}_to_#{key}" do
self.send("#{status_store.attribute_name}=", value)
end
end
define_method "#{status_store.attribute_name}?" do |status|
self.send("#{status_store.attribute_name}_#{status}?")
end
define_method "#{status_store.attribute_name}_was?" do |status|
self.send("#{status_store.attribute_name}_was_#{status}?")
end
define_method "#{status_store.attribute_name}_to" do |status|
raise "#{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)
self.send("#{status_store.attribute_name}=", status_value)
end
define_method "update_#{status_store.attribute_name}_to" do |status|
raise "#{status} is undefined status or it is group status" unless status_store.status?(status)
self.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 = self.send("#{status_store.attribute_name}_change")
if statuses
if statuses[0] == statuses[1]
return false
elsif options[:from] && options[:to]
self.send("#{status_store.attribute_name}_was?", options[:from]) && self.send("#{status_store.attribute_name}?", options[:to])
elsif options[:to]
self.send("#{status_store.attribute_name}?", options[:to])
elsif options[:from]
self.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
self.status_store_list.get(status_store.attribute_name).status_sets
end
end
|