forked from ManageIQ/manageiq
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathreserved_mixin.rb
76 lines (67 loc) · 1.79 KB
/
reserved_mixin.rb
1
2
3
4
5
6
7
8
9
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
module ReservedMixin
extend ActiveSupport::Concern
included do
has_one :reserved_rec, :class_name => "::Reserve", :as => :resource,
:autosave => true, :dependent => :delete
end
module ClassMethods
# Dynamically creates a getter, setter, and ? method that uses the
# reserved column as a Hash to store the value.
def reserve_attribute(name, type)
name = name.to_sym
attribute name, type
define_method(name) { reserved_hash_get(name) }
define_method("#{name}?") { !!reserved_hash_get(name) }
define_method("#{name}=") do |val|
send("#{name}_will_change!")
reserved_hash_set(name, val)
end
end
end
def reserved_hash_get(key)
res = reserved
res && res[key]
end
def reserved_hash_set(key, val)
res = (reserved || {})
if val.nil?
res.delete(key)
else
res[key] = val
end
self.reserved = res
val
end
# Migrate values from the reserved hash to a column. Accepts either
# an Array of key names when the column names match the key names, or
# a Hash of key names to column names if the column names do not match the
# key names
def reserved_hash_migrate(*keys)
keys = keys.flatten
if keys.last.kind_of?(Hash)
keys = keys.last
else
keys = keys.zip(keys) # [:key1, :key2] => [[:key1, :key1], [:key2, :key2]]
end
keys.each do |key, attribute|
val = reserved_hash_get(key)
reserved_hash_set(key, nil)
send("#{attribute}=", val)
end
self.save!
end
def reserved
reserved_rec.try(:reserved)
end
def reserved=(val)
res = reserved_rec
if val.blank?
self.reserved_rec = nil
elsif res.nil?
build_reserved_rec(:reserved => val)
else
res.reserved = val
end
val
end
end