Module: ActiveRecord::PGArray

Defined in:
lib/activerecord/pg_array.rb

Class Method Summary collapse

Class Method Details

.included(base) ⇒ Object



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 # base.class_eval
end