From 7c74a1d9c5df92ceed0da12e4319801e316d0b0e Mon Sep 17 00:00:00 2001 From: Nikolai B Date: Wed, 8 Jan 2025 14:25:13 +0000 Subject: [PATCH] Fix AR type cast to mirror quoting --- .../connection_adapters/postgis/quoting.rb | 5 +++-- test/cases/spatial_queries_test.rb | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/active_record/connection_adapters/postgis/quoting.rb b/lib/active_record/connection_adapters/postgis/quoting.rb index 1d7c8b98..49b5bbf7 100644 --- a/lib/active_record/connection_adapters/postgis/quoting.rb +++ b/lib/active_record/connection_adapters/postgis/quoting.rb @@ -5,8 +5,9 @@ module ConnectionAdapters module PostGIS module Quoting def type_cast(value) - case value - when RGeo::Feature::Instance + if RGeo::Feature::Geometry.check_type(value) + RGeo::WKRep::WKBGenerator.new(hex_format: true, type_format: :ewkb, emit_ewkb_srid: true).generate(value) + elsif value.is_a?(RGeo::Cartesian::BoundingBox) value.to_s else super diff --git a/test/cases/spatial_queries_test.rb b/test/cases/spatial_queries_test.rb index 2a44d3c7..06188a20 100644 --- a/test/cases/spatial_queries_test.rb +++ b/test/cases/spatial_queries_test.rb @@ -122,6 +122,23 @@ def test_geo_safe_where assert_equal 1, SpatialModel.where("ST_DWITHIN(latlon_geo, ?, 500)", geographic_factory.point(-72.099, 42.099)).count end + def test_geo_query_matches_sql + value = geographic_factory.point(-72.099, 42.099) + + assert_match( + RGeo::WKRep::WKBGenerator.new(hex_format: true, type_format: :ewkb, emit_ewkb_srid: true).generate(value), + SpatialModel.where("ST_DWITHIN(latlon_geo, ?, 500)", value).explain.inspect + ) + end + + def test_srid_aware_query + center = RGeo::Geos.factory(srid: 4326).point(3.808591, 43.606092) + polygon = center.buffer(10_000) + model = SpatialModel.create!(geometry: polygon) + + assert_equal [model], SpatialModel.where("ST_Within(?, geometry)", center) + end + private def create_model @@ -130,6 +147,7 @@ def create_model t.column "latlon_geo", :st_point, srid: 4326, geographic: true t.column "points", :multi_point, srid: 3785 t.column "path", :line_string, srid: 3785 + t.column "geometry", :geometry, srid: 4326 end SpatialModel.reset_column_information end