Module: SchemaPlus::Enums::ActiveRecord::ConnectionAdapters::PostgresqlAdapter

Defined in:
lib/schema_plus/enums/active_record.rb

Instance Method Summary collapse

Instance Method Details

#alter_enum(name, value, options = {}) ⇒ Object



37
38
39
40
41
42
43
44
45
# File 'lib/schema_plus/enums/active_record.rb', line 37

def alter_enum(name, value, options = {})
  opts = case
         when options[:before] then "BEFORE #{escape_enum_value(options[:before])}"
         when options[:after] then "AFTER #{escape_enum_value(options[:after])}"
         else
           ''
         end
  execute "ALTER TYPE #{enum_name(name, options[:schema])} ADD VALUE #{escape_enum_value(value)} #{opts}"
end

#create_enum(name, *values) ⇒ Object



31
32
33
34
35
# File 'lib/schema_plus/enums/active_record.rb', line 31

def create_enum(name, *values)
  options = values.extract_options!
  list = values.map { |value| escape_enum_value(value) }
  execute "CREATE TYPE #{enum_name(name, options[:schema])} AS ENUM (#{list.join(',')})"
end

#drop_enum(name, options = {}) ⇒ Object



47
48
49
# File 'lib/schema_plus/enums/active_record.rb', line 47

def drop_enum(name, options = {})
  execute "DROP TYPE #{enum_name(name, options[:schema])}"
end

#enumsObject



6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/schema_plus/enums/active_record.rb', line 6

def enums
  result = query(<<-SQL)
    SELECT
      N.nspname AS schema_name,
      T.typname AS enum_name,
      E.enumlabel AS enum_label,
      E.enumsortorder AS enum_sort_order
      --array_agg(E.enumlabel ORDER BY enumsortorder) AS labels
    FROM pg_type T
    JOIN pg_enum E ON E.enumtypid = T.oid
    JOIN pg_namespace N ON N.oid = T.typnamespace
    ORDER BY 1, 2, 4
  SQL

  result.reduce([]) do |res, row|
    last = res.last
    if last && last[0] == row[0] && last[1] == row[1]
      last[2] << row[2]
    else
      res << (row[0..1] << [row[2]])
    end
    res
  end
end