module ActiveRecord::PostgresEnum::PostgreSQLAdapter

Constants

DEFINED_ENUMS_QUERY

Public Instance Methods

add_enum_value(name, value, after: nil, before: nil, if_not_exists: nil) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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() click to toggle source
# 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() click to toggle source
Calls superclass method
# File lib/active_record/postgres_enum/postgresql_adapter.rb, line 93
def migration_keys
  super + [:enum_name]
end
prepare_column_options(column, types) click to toggle source
Calls superclass method
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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?() click to toggle source
# 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