module SchemaPlus::Enums::ActiveRecord::ConnectionAdapters::PostgresqlAdapter

Public Instance Methods

alter_enum(name, value, options = {}) click to toggle source
# 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) click to toggle source
# 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 = {}) click to toggle source
# File lib/schema_plus/enums/active_record.rb, line 47
def drop_enum(name, options = {})
  execute "DROP TYPE #{enum_name(name, options[:schema])}"
end
enums() click to toggle source
# 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

Private Instance Methods

enum_name(name, schema) click to toggle source
# File lib/schema_plus/enums/active_record.rb, line 53
def enum_name(name, schema)
  [schema || 'public', name].map { |s|
    %Q{"#{s}"}
  }.join('.')
end
escape_enum_value(value) click to toggle source
# File lib/schema_plus/enums/active_record.rb, line 59
def escape_enum_value(value)
  escaped_value = value.to_s.sub("'", "''")
  "'#{escaped_value}'"
end