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 =
<<~SQL
SELECT
t.OID,
t.typname,
t.typtype,
array_to_string(array_agg(e.enumlabel ORDER BY e.enumsortorder), '\t\t', '') as enumlabels
FROM pg_type t
LEFT JOIN pg_enum e ON e.enumtypid = t.oid
WHERE typtype = 'e'
GROUP BY t.OID, t.typname, t.typtype
ORDER BY t.typname
SQL
Instance Method Summary
collapse
-
#add_enum_value(name, value, after: nil, before: nil, if_not_exists: nil) ⇒ Object
-
#create_enum(name, values, force: false, if_not_exists: nil) ⇒ Object
-
#drop_enum(name, cascade: nil, if_exists: nil) ⇒ Object
-
#enums ⇒ Object
-
#migration_keys ⇒ Object
-
#prepare_column_options(column, types) ⇒ Object
-
#remove_enum_value(name, value) ⇒ Object
-
#rename_enum(name, new_name) ⇒ Object
-
#rename_enum_value(name, existing_value, new_value) ⇒ Object
-
#rename_enum_value_supported? ⇒ Boolean
Instance Method Details
#add_enum_value(name, value, after: nil, before: nil, if_not_exists: nil) ⇒ Object
66
67
68
69
70
71
72
73
74
75
76
|
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 66
def add_enum_value(name, value, after: nil, before: nil, if_not_exists: nil)
if_not_exists_statement = "IF NOT EXISTS" if if_not_exists
sql = "ALTER TYPE #{name} ADD VALUE #{if_not_exists_statement} #{quote value}"
if after
sql += " AFTER #{quote after}"
elsif before
sql += " BEFORE #{quote before}"
end
execute sql
end
|
#create_enum(name, values, force: false, if_not_exists: nil) ⇒ Object
45
46
47
48
49
50
51
52
|
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 45
def create_enum(name, values, force: false, if_not_exists: nil)
return if if_not_exists && enums.include?(name.to_sym)
drop_enum(name, cascade: force == :cascade, if_exists: true) if force
values = values.map { |v| quote v }
execute "CREATE TYPE #{name} AS ENUM (#{values.join(", ")})"
end
|
#drop_enum(name, cascade: nil, if_exists: nil) ⇒ Object
54
55
56
57
58
59
60
|
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 54
def drop_enum(name, cascade: nil, if_exists: nil)
if_exists_statement = "IF EXISTS" if if_exists
cascade_statement = "CASCADE" if cascade
sql = "DROP TYPE #{if_exists_statement} #{name} #{cascade_statement}"
execute sql
end
|
#enums ⇒ Object
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_keys ⇒ Object
93
94
95
|
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 93
def migration_keys
super + [:enum_name]
end
|
#prepare_column_options(column, types) ⇒ Object
97
98
99
100
101
|
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 97
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
|
#remove_enum_value(name, value) ⇒ Object
78
79
80
81
82
83
84
85
|
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 78
def remove_enum_value(name, value)
sql = %{
DELETE FROM pg_enum
WHERE enumlabel=#{quote value}
AND enumtypid=(SELECT oid FROM pg_type WHERE typname='#{name}')
}
execute sql
end
|
#rename_enum(name, new_name) ⇒ Object
62
63
64
|
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 62
def rename_enum(name, new_name)
execute "ALTER TYPE #{name} RENAME TO #{new_name}"
end
|
#rename_enum_value(name, existing_value, new_value) ⇒ Object
87
88
89
90
91
|
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 87
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
103
104
105
|
# File 'lib/active_record/postgres_enum/postgresql_adapter.rb', line 103
def rename_enum_value_supported?
ActiveRecord::Base.connection.send(:postgresql_version) >= 100_000
end
|