Module: ActiveRecord::ConnectionAdapters::PostGIS

Defined in:
lib/active_record/connection_adapters/postgis.rb,
lib/active_record/connection_adapters/postgis/quoting.rb,
lib/active_record/connection_adapters/postgis/railtie.rb,
lib/active_record/connection_adapters/postgis/version.rb,
lib/active_record/connection_adapters/postgis/constants.rb,
lib/active_record/connection_adapters/postgis/type/point.rb,
lib/active_record/connection_adapters/postgis/oid/spatial.rb,
lib/active_record/connection_adapters/postgis/test_helpers.rb,
lib/active_record/connection_adapters/postgis/type/polygon.rb,
lib/active_record/connection_adapters/postgis/type/spatial.rb,
lib/active_record/connection_adapters/postgis/schema_dumper.rb,
lib/active_record/connection_adapters/postgis/type/geometry.rb,
lib/active_record/connection_adapters/postgis/column_methods.rb,
lib/active_record/connection_adapters/postgis/type/geography.rb,
lib/active_record/connection_adapters/postgis/spatial_queries.rb,
lib/active_record/connection_adapters/postgis/table_definition.rb,
lib/active_record/connection_adapters/postgis/type/line_string.rb,
lib/active_record/connection_adapters/postgis/type/multi_point.rb,
lib/active_record/connection_adapters/postgis/column_extensions.rb,
lib/active_record/connection_adapters/postgis/oid/spatial_types.rb,
lib/active_record/connection_adapters/postgis/schema_statements.rb,
lib/active_record/connection_adapters/postgis/adapter_extensions.rb,
lib/active_record/connection_adapters/postgis/type/multi_polygon.rb,
lib/active_record/connection_adapters/postgis/database_statements.rb,
lib/active_record/connection_adapters/postgis/spatial_column_type.rb,
lib/active_record/connection_adapters/postgis/spatial_column_methods.rb,
lib/active_record/connection_adapters/postgis/type/multi_line_string.rb,
lib/active_record/connection_adapters/postgis/type/geometry_collection.rb

Defined Under Namespace

Modules: AdapterExtensions, ColumnDefinitionUtils, ColumnExtensions, ColumnMethods, DatabaseStatements, OID, Quoting, RegisterTypes, SchemaDumper, SchemaStatements, SpatialColumnMethods, SpatialQueries, SpatialScopes, TableDefinition, TestHelpers, Type, TypeRegistration Classes: Error, Railtie, SpatialColumnAssertion, SpatialColumnType, SpatialTableDefinition

Constant Summary collapse

SPATIAL_TYPES_FOR_REGISTRATION =
%i[
  st_geography st_geometry st_geometry_collection st_line_string st_multi_line_string
  st_multi_point st_multi_polygon st_point st_polygon line_string
].freeze
SPATIAL_OPTIONS_FOR_REGISTRATION =
%i[srid has_z has_m geographic].freeze
POSTGIS_SYSTEM_TABLES =
%w[
  geography_columns
  geometry_columns
  layer
  raster_columns
  raster_overviews
  spatial_ref_sys
  topology
].freeze
VERSION =
"0.6.0"
SPATIAL_TYPES =
%i[
  geometry
  geography
  point
  line_string
  polygon
  multi_point
  multi_line_string
  multi_polygon
  geometry_collection
].freeze
GEOMETRIC_TYPES =
%i[
  st_geography
  st_geometry
  st_geometry_collection
  st_line_string
  st_multi_line_string
  st_multi_point
  st_multi_polygon
  st_point
  st_polygon
].freeze
VALID_TYPES =
%w[
  point line_string polygon multi_point
  multi_line_string multi_polygon geometry_collection geography
].freeze

Class Method Summary collapse

Class Method Details

.extend_postgresql_adapterObject



59
60
61
62
63
64
65
# File 'lib/active_record/connection_adapters/postgis.rb', line 59

def self.extend_postgresql_adapter
  PostgreSQL::Column.include(ColumnExtensions)
  PostgreSQLAdapter.prepend(Quoting)
  PostgreSQL::Table.include(PostGIS::TableDefinition)
  PostgreSQLAdapter.prepend(AdapterExtensions)
  PostgreSQLAdapter.prepend(DatabaseStatements)
end

.ignore_postgis_system_tablesObject



132
133
134
135
136
137
138
# File 'lib/active_record/connection_adapters/postgis.rb', line 132

def self.ignore_postgis_system_tables
  if ActiveRecord.respond_to?(:schema_ignored_tables)
    ActiveRecord.schema_ignored_tables |= POSTGIS_SYSTEM_TABLES
  else
    PostgreSQL::SchemaDumper.ignore_tables |= POSTGIS_SYSTEM_TABLES
  end
end

.initialize!Object



48
49
50
51
52
53
54
55
56
57
# File 'lib/active_record/connection_adapters/postgis.rb', line 48

def self.initialize!
  return if @initialized
  @initialized = true

  extend_postgresql_adapter

  register_spatial_types

  ignore_postgis_system_tables
end

.register_column_methodsObject



95
96
97
98
99
100
101
102
# File 'lib/active_record/connection_adapters/postgis.rb', line 95

def self.register_column_methods
  PostgreSQL::TableDefinition.send(:define_column_methods,
    :st_geography, :st_geometry, :st_geometry_collection, :st_line_string,
    :st_multi_line_string, :st_multi_point, :st_multi_polygon, :st_point, :st_polygon,
    :geography, :geometry, :geometry_collection, :line_string,
    :multi_line_string, :multi_point, :multi_polygon, :polygon,
    *SPATIAL_OPTIONS_FOR_REGISTRATION)
end

.register_native_database_typesObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/active_record/connection_adapters/postgis.rb', line 74

def self.register_native_database_types
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:st_geography] = { name: "geography" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:st_geometry] = { name: "geometry" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:st_geometry_collection] = { name: "geometry(GeometryCollection)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:st_line_string] = { name: "geometry(LineString)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:st_multi_line_string] = { name: "geometry(MultiLineString)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:st_multi_point] = { name: "geometry(MultiPoint)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:st_multi_polygon] = { name: "geometry(MultiPolygon)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:st_point] = { name: "geometry(Point)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:st_polygon] = { name: "geometry(Polygon)" }

  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:geography] = { name: "geography" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:geometry] = { name: "geometry" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:geometry_collection] = { name: "geometry(GeometryCollection)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:line_string] = { name: "geometry(LineString)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:multi_line_string] = { name: "geometry(MultiLineString)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:multi_point] = { name: "geometry(MultiPoint)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:multi_polygon] = { name: "geometry(MultiPolygon)" }
  PostgreSQLAdapter::NATIVE_DATABASE_TYPES[:polygon] = { name: "geometry(Polygon)" }
end

.register_spatial_typesObject



67
68
69
70
71
72
# File 'lib/active_record/connection_adapters/postgis.rb', line 67

def self.register_spatial_types
  register_native_database_types
  register_column_methods
  register_type_classes
  register_type_mapping
end

.register_type_classesObject



104
105
106
107
108
109
110
111
112
113
114
# File 'lib/active_record/connection_adapters/postgis.rb', line 104

def self.register_type_classes
  adapter_name = :postgresql

  SPATIAL_TYPES_FOR_REGISTRATION.each do |type_name|
    type_class_name = type_name.to_s.sub(/^st_/, "").split("_").map(&:capitalize).join
    type_class = Type.const_get(type_class_name) rescue nil
    if type_class
      ActiveRecord::Type.register(type_name, type_class, adapter: adapter_name)
    end
  end
end

.register_type_mappingObject



116
117
118
119
120
121
122
# File 'lib/active_record/connection_adapters/postgis.rb', line 116

def self.register_type_mapping
  if PostgreSQLAdapter.respond_to?(:register_type_mapping)
    PostgreSQLAdapter.register_type_mapping { |m| TypeRegistration.register!(m) }
  else
    PostgreSQLAdapter.singleton_class.prepend(RegisterTypes)
  end
end

.schema_ignored_tablesObject



124
125
126
127
128
129
130
# File 'lib/active_record/connection_adapters/postgis.rb', line 124

def self.schema_ignored_tables
  if ActiveRecord.respond_to?(:schema_ignored_tables)
    ActiveRecord.schema_ignored_tables
  else
    PostgreSQL::SchemaDumper.ignore_tables
  end
end