Class: ActiveRecord::ConnectionAdapters::PostgreSQLAdapter

Inherits:
Object
  • Object
show all
Defined in:
lib/enum_column/postgresql_adapter.rb

Instance Method Summary collapse

Instance Method Details

#__native_database_types_enumObject



4
# File 'lib/enum_column/postgresql_adapter.rb', line 4

alias __native_database_types_enum native_database_types

#add_column_options!(sql, options) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/enum_column/postgresql_adapter.rb', line 42

def add_column_options!(sql, options)
  unless sql =~ /\(32\)\('[^']+'/
    super(sql, options)
  else
    sql.gsub!(/("[^"]+")([^3]+32\))(.+)/, '\1\2 CHECK(\1 in \3)')
    super(sql, options)
  end
end

#column_definitions(table_name) ⇒ Object

Add constraints to the list of columns. This will only pick up check constraints. We’ll filter the constraint for the column type and ANY ((ARRAY[ type.



29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/enum_column/postgresql_adapter.rb', line 29

def column_definitions(table_name)
  query <<-end_sql
    SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull, c.consrc
      FROM pg_attribute a LEFT JOIN pg_attrdef d
        ON a.attrelid = d.adrelid AND a.attnum = d.adnum
        LEFT JOIN pg_constraint c ON a.attrelid = c.conrelid AND 
          c.contype = 'c' AND c.conkey[1] = a.attnum
      WHERE a.attrelid = '#{table_name}'::regclass
        AND a.attnum > 0 AND NOT a.attisdropped
      ORDER BY a.attnum
  end_sql
end

#columns(table_name, name = nil) ⇒ Object

:nodoc:



12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/enum_column/postgresql_adapter.rb', line 12

def columns(table_name, name = nil)#:nodoc:
  column_definitions(table_name).collect do |name, type, default, notnull, consrc|
    values = nil
    if consrc and consrc =~ /ANY \(\(ARRAY(\[[^]]+\])/o and type == native_database_types[:enum][:name]
      values = eval $1.gsub(/::character varying/, '')
      type = 'enum'
    end
    
    # typmod now unused as limit, precision, scale all handled by superclass
    PostgreSQLColumnWithEnum.new(name, default_value(default),
                                 translate_field_type(type), notnull == "f",
                                 values)
  end
end

#native_database_typesObject

:nodoc



6
7
8
9
10
# File 'lib/enum_column/postgresql_adapter.rb', line 6

def native_database_types #:nodoc
  types = __native_database_types_enum
  types[:enum] = { :name => "character varying(32)" }
  types
end