ruby-on-rails-4 activerecord rgeo

ruby on rails 4 - Deserializar la columna RGeo como SphericalPointImpl



ruby-on-rails-4 activerecord (0)

hay una tabla con una columna RGeo en Rails 4.2.4 y activerecord-postgis-adapter 3.1.2

class CreateAddresses < ActiveRecord::Migration def change create_table :addresses do |t| t.st_point :coordinates, geographic: true, srid: 4326 end add_index :addresses, :coordinates, using: :gist end end

y un método que agrupa objetos por su ubicación

def self.group_by_coords includes(:address). joins(:address). group(''addresses.coordinates::geometry''). pluck( ''array_agg(realties.id) as ids, addresses.coordinates::geometry'' ) end

con la prueba correspondiente:

describe ''group_by_coords'' do it ''correctly group realties'' do # create samples expect(Realty.group_by_coords).to eq( [[[r1.id, r2.id], r1.address.coordinates], [[r3.id], r3.address.coordinates]] ) end end

el problema es que pluck devuelve RGeo::Geos::CAPIPointImpl lugar de RGeo::Geographic::SphericalPointImpl

expected: [[[1670, 1671], #<RGeo::Geographic::SphericalPointImpl:0x3fd37e9b8a20 "POINT (106.0 10.0)">], [[1672], #<RGeo::Geographic::SphericalPointImpl:0x3fd37ab2dddc "POINT (106.5 10.5)">]] got: [[[1671, 1670], #<RGeo::Geos::CAPIPointImpl:0x3fd37a335a44 "POINT (106.0 10.0)">], [[1672], #<RGeo::Geos::CAPIPointImpl:0x3fd37a33560c "POINT (106.5 10.5)">]]

Creo que para arreglar eso se debe especificar una fábrica correcta. Traté de especificarlo así

RGeo::ActiveRecord::SpatialFactoryStore.instance.tap do |config| config.default = RGeo::Geos.factory_generator config.register(RGeo::Geographic.spherical_factory(srid: 4326), geo_type: "point", sql_type: "geography") end

pero luego deserializa todos los puntos como RGeo::Geos::CAPIPointImpl que es más genérico e incompatible con la base de código existente.

Entonces, la pregunta es cómo deserializar todos los puntos como RGeo::Geographic::SphericalPointImpl ?