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
|
# File 'lib/activerecord/pg_array.rb', line 6
def self.included(base)
base.class_eval do
self.column_types.to_a.select { |c| c[1].instance_variable_get('@array') }.map(&:first).each do |array_column_name|
ids_regex = /_ids$/
friendly_attr = array_column_name.sub(ids_regex,'')
segs = friendly_attr.split('_')
segs[-1] = segs[-1].singularize
friendly_attr_singular = segs.join('_')
segs[-1] = segs[-1].pluralize
friendly_attr_plural = segs.join('_')
obj_convert = ->(obj) do
if array_column_name =~ ids_regex && obj.kind_of?(ActiveRecord::Base)
obj = obj.id
end
obj
end
atr = ->(slf) do
slf.send array_column_name.to_sym
end
atr_will_change = ->(slf) do
slf.send(:"#{array_column_name}_will_change!")
end
define_method :"add_#{friendly_attr_singular}" do |obj|
obj = obj_convert[obj]
unless atr[self].include?(obj)
atr[self].push(obj)
atr_will_change[self]
end
end
define_method :"add_#{friendly_attr_singular}!" do |obj|
self.send :"add_#{friendly_attr_singular}", obj
self.save!
end
define_method :"add_#{friendly_attr_plural}" do |objs|
objs.each do |obj|
self.send :"add_#{friendly_attr_singular}", obj
end
end
define_method :"remove_#{friendly_attr_singular}" do |obj|
obj = obj_convert.call(obj)
if atr[self].include?(obj)
atr[self].remove(obj)
atr_will_change[self]
end
end
define_method :"remove_#{friendly_attr_singular}!" do |obj|
self.send :"remove_#{friendly_attr_singular}", obj
self.save!
end
end
end end
|