Module: ND::PG::Enum::Migrations::Concern

Included in:
ActiveRecord::Migration
Defined in:
lib/nd/pg/enum/migrations.rb

Instance Method Summary collapse

Instance Method Details

#add_enum_value(name, *values) ⇒ Object Also known as: add_enum_values



26
27
28
# File 'lib/nd/pg/enum/migrations.rb', line 26

def add_enum_value(name, *values)
  change_enum_values(name, add: values.flatten)
end

#change_enum_values(name, add: [], remove: []) ⇒ Object



36
37
38
39
40
41
# File 'lib/nd/pg/enum/migrations.rb', line 36

def change_enum_values(name, add: [], remove: [])
  reversible do |direction|
    direction.up   { _change_enum_values(name, add: add, remove: remove) }
    direction.down { _change_enum_values(name, add: remove, remove: add) }
  end
end

#columns_from_type(type) ⇒ Object



58
59
60
61
62
63
64
# File 'lib/nd/pg/enum/migrations.rb', line 58

def columns_from_type(type)
  values = ActiveRecord::Base.connection.execute(<<~SQL.squish)
    SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = 'public' AND udt_name = '#{type}';
  SQL

  values.to_a.map(&:symbolize_keys)
end

#create_enum(name, values) ⇒ Object



7
8
9
10
11
12
# File 'lib/nd/pg/enum/migrations.rb', line 7

def create_enum(name, values)
  reversible do |direction|
    direction.up   { _create_enum(name, values) }
    direction.down { _drop_enum(name) }
  end
end

#drop_enum(name, values = nil) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
# File 'lib/nd/pg/enum/migrations.rb', line 14

def drop_enum(name, values = nil)
  if values
    reversible do |direction|
      direction.up   { _drop_enum(name) }
      direction.down { _create_enum(name, values) }
    end
  else
    # If reverted, an ActiveRecord::IrreversibleMigration error will be raised.
    _drop_enum(name)
  end
end

#enum_values(name) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/nd/pg/enum/migrations.rb', line 50

def enum_values(name)
  values = ActiveRecord::Base.connection.execute(<<~SQL.squish)
    SELECT unnest(enum_range(null, null::#{name})) AS value;
  SQL

  values.map { |value| value['value'] }
end

#remove_enum_value(name, *values) ⇒ Object Also known as: remove_enum_values



31
32
33
# File 'lib/nd/pg/enum/migrations.rb', line 31

def remove_enum_value(name, *values)
  change_enum_values(name, remove: values.flatten)
end

#rename_enum(from, to) ⇒ Object



43
44
45
46
47
48
# File 'lib/nd/pg/enum/migrations.rb', line 43

def rename_enum(from, to)
  reversible do |direction|
    direction.up   { _rename_enum(from, to) }
    direction.down { _rename_enum(to, from) }
  end
end