Module: ActiveRecord::PostgresEnum::PostgreSQLAdapter

Defined in:
lib/active_record/postgres_enum/postgresql_adapter.rb

Defined Under Namespace

Modules: ColumnDumperExt, SchemaDumperExt

Constant Summary collapse

DEFINED_ENUMS_QUERY =
"SELECT\n  t.OID,\n  t.typname,\n  t.typtype,\n  array_to_string(array_agg(e.enumlabel ORDER BY e.enumsortorder), '\\t\\t', '') as enumlabels\nFROM pg_type t\nLEFT JOIN pg_enum e ON e.enumtypid = t.oid\nWHERE typtype = 'e'\nGROUP BY t.OID, t.typname, t.typtype\nORDER BY t.typname\n"

Instance Method Summary collapse

Instance Method Details

#add_enum_value(name, value, after: nil, before: nil) ⇒ Object



58
59
60
61
62
63
64
65
66
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 58

def add_enum_value(name, value, after: nil, before: nil)
  sql = "ALTER TYPE #{name} ADD VALUE #{quote value}"
  if after
    sql += " AFTER #{quote after}"
  elsif before
    sql += " BEFORE #{quote before}"
  end
  execute sql
end

#create_enum(name, values) ⇒ Object



45
46
47
48
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 45

def create_enum(name, values)
  values = values.map { |v| quote v }
  execute "CREATE TYPE #{name} AS ENUM (#{values.join(', ')})"
end

#drop_enum(name) ⇒ Object



50
51
52
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 50

def drop_enum(name)
  execute "DROP TYPE #{name}"
end

#enumsObject



39
40
41
42
43
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 39

def enums
  select_all(DEFINED_ENUMS_QUERY).each_with_object({}) do |row, memo|
    memo[row["typname"].to_sym] = row['enumlabels'].split("\t\t")
  end
end

#migration_keysObject



74
75
76
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 74

def migration_keys
  super + [:enum_name]
end

#prepare_column_options(column, types) ⇒ Object



78
79
80
81
82
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 78

def prepare_column_options(column, types)
  spec = super(column, types)
  spec[:enum_name] = column.cast_type.enum_name.inspect if column.type == :enum
  spec
end

#rename_enum(name, new_name) ⇒ Object



54
55
56
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 54

def rename_enum(name, new_name)
  execute "ALTER TYPE #{name} RENAME TO #{new_name}"
end

#rename_enum_value(name, existing_value, new_value) ⇒ Object



68
69
70
71
72
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 68

def rename_enum_value(name, existing_value, new_value)
  raise "Renaming enum values is only supported in PostgreSQL 10.0+" unless rename_enum_value_supported?

  execute "ALTER TYPE #{name} RENAME VALUE #{quote existing_value} TO #{quote new_value}"
end

#rename_enum_value_supported?Boolean

Returns:

  • (Boolean)


84
85
86
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 84

def rename_enum_value_supported?
  ActiveRecord::Base.connection.send(:postgresql_version) >= 100_000
end