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/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/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/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, OID, Quoting, RegisterTypes, SchemaDumper, SchemaStatements, SpatialColumnMethods, TableDefinition, TestHelpers, Type Classes: Error, 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
VERSION =
"0.3.1"
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

.initialize!Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/active_record/connection_adapters/postgis.rb', line 36

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

  # Extend PostgreSQL Column class with spatial functionality
  PostgreSQL::Column.include(ColumnExtensions)

  # Add spatial object quoting support
  PostgreSQLAdapter.prepend(Quoting)

  # Allow PostGIS specific options in table definitions
  # The `define_column_methods` call already makes these available on the `TableDefinition` instance.
  # The issue might be deeper in how schema.rb is processed or how options are validated.
  # Let's ensure that the column methods are defined *before* any schema loading that might trigger validation.

  PostgreSQL::Table.include(
    PostGIS::TableDefinition
  )

  # Using st_* prefix to avoid conflicts with PostgreSQL native geometric 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)" }

  # Legacy aliases for compatibility with activerecord-postgis-adapter
  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)" }


  # Tell Rails these are valid column methods for schema dumping - PostgreSQL only
  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,
                                                                      # Legacy column methods for compatibility with activerecord-postgis-adapter
                                                                      :geography, :geometry, :geometry_collection, :line_string,
                                                                      :multi_line_string, :multi_point, :multi_polygon, :polygon,
                                                                      *SPATIAL_OPTIONS_FOR_REGISTRATION)

  # prevent unknown OID warning and register PostGIS types
  PostgreSQLAdapter.singleton_class.prepend(RegisterTypes)

  # Prepend our extensions to handle spatial columns
  PostgreSQLAdapter.prepend(AdapterExtensions)

  # Register spatial types with ActiveRecord::Type - use st_* prefix to avoid conflicts
  adapter_name = :postgresql

  # Register specific spatial types with their corresponding classes
  ActiveRecord::Type.register(:st_geography, Type::Geography, adapter: adapter_name)
  ActiveRecord::Type.register(:st_geometry, Type::Geometry, adapter: adapter_name)
  ActiveRecord::Type.register(:st_geometry_collection, Type::GeometryCollection, adapter: adapter_name)
  ActiveRecord::Type.register(:st_line_string, Type::LineString, adapter: adapter_name)
  ActiveRecord::Type.register(:st_multi_line_string, Type::MultiLineString, adapter: adapter_name)
  ActiveRecord::Type.register(:st_multi_point, Type::MultiPoint, adapter: adapter_name)
  ActiveRecord::Type.register(:st_multi_polygon, Type::MultiPolygon, adapter: adapter_name)
  ActiveRecord::Type.register(:st_point, Type::Point, adapter: adapter_name)
  ActiveRecord::Type.register(:st_polygon, Type::Polygon, adapter: adapter_name)

  # Legacy type registrations for compatibility with activerecord-postgis-adapter
  ActiveRecord::Type.register(:geography, Type::Geography, adapter: adapter_name)
  ActiveRecord::Type.register(:geometry, Type::Geometry, adapter: adapter_name)
  ActiveRecord::Type.register(:geometry_collection, Type::GeometryCollection, adapter: adapter_name)
  ActiveRecord::Type.register(:line_string, Type::LineString, adapter: adapter_name)
  ActiveRecord::Type.register(:multi_line_string, Type::MultiLineString, adapter: adapter_name)
  ActiveRecord::Type.register(:multi_point, Type::MultiPoint, adapter: adapter_name)
  ActiveRecord::Type.register(:multi_polygon, Type::MultiPolygon, adapter: adapter_name)
  ActiveRecord::Type.register(:polygon, Type::Polygon, adapter: adapter_name)

  # Ignore PostGIS system tables in schema dumps - PostgreSQL specific
  PostgreSQL::SchemaDumper.ignore_tables |= %w[
        geography_columns
        geometry_columns
        layer
        raster_columns
        raster_overviews
        spatial_ref_sys
        topology
      ]
end