les*_*ess 13 postgresql activerecord postgis ruby-on-rails-4 rgeo
在Rails 4.2.4和activerecord-postgis-adapter 3.1.2中有一个带RGeo列的表
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
Run Code Online (Sandbox Code Playgroud)
以及按对象位置对对象进行分组的方法
def self.group_by_coords
includes(:address).
joins(:address).
group('addresses.coordinates::geometry').
pluck(
'array_agg(realties.id) as ids, addresses.coordinates::geometry'
)
end
Run Code Online (Sandbox Code Playgroud)
与相应的测试:
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
Run Code Online (Sandbox Code Playgroud)
问题是pluck
返回 RGeo::Geos::CAPIPointImpl
而不是 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)">]]
Run Code Online (Sandbox Code Playgroud)
我相信为了确定必须指定一个正确的工厂.我试着像这样指定它
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
Run Code Online (Sandbox Code Playgroud)
但它然后反序列化所有点,因为RGeo::Geos::CAPIPointImpl
它更通用,与现有代码库不兼容.
那么问题是如何将所有点反序列化为RGeo::Geographic::SphericalPointImpl
?
这里可能发生的事情可能比您期望的更简单,让我们只看一下前几个字符。
expected: [[[1670, 1671],...
got: [[[1671, 1670],...
Run Code Online (Sandbox Code Playgroud)
为什么这些会有所不同?
归档时间: |
|
查看次数: |
232 次 |
最近记录: |