我有一个包含以下架构的供应商模型
create_table "vendors", force: :cascade do |t|
t.string "name"
t.decimal "latitude", precision: 9, scale: 6
t.decimal "longitude", precision: 9, scale: 6
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
我使用Faker gem填充数据库,并使用少量硬编码值来获取经度和纬度
我需要在特定的距离内找到附近的供应商。我能够通过我的vendor.rb中的以下代码实现此目的.rb
scope :close_to, -> (latitude, longitude, distance_in_meters = 2000) {
where(%{
ST_DWithin(
ST_GeographyFromText(
'SRID=4326;POINT(' || vendors.longitude || ' ' ||
vendors.latitude || ')'
),
ST_GeographyFromText('SRID=4326;POINT(%f %f)'),
%d
)
} % [longitude, latitude, distance_in_meters])
}
所以,如果我打电话
Vendor.close_to(39.000000, -76.000000, 500)
在我的rails控制台中我得到了四行。现在我需要找到每个行坐标和close_to范围内提到的坐标之间的实际距离。为了实现这一点,我在vendor.rb中编写了以下代码
class Vendor < ActiveRecord::Base
scope :close_to, -> (latitude, longitude, distance_in_meters = 2000) {
where(%{
ST_DWithin(
ST_GeographyFromText(
'SRID=4326;POINT(' || vendors.longitude || ' ' ||
vendors.latitude || ')'
),
ST_GeographyFromText('SRID=4326;POINT(%f %f)'),
%d
)
} % [longitude, latitude, distance_in_meters])
}
scope :dist, -> {
where(%{
ST_Distance(
ST_GeographyFromText(
'SRID=4326;POINT(' || vendors.longitude || ' ' ||
vendors.latitude || ')'
),
ST_GeographyFromText('SRID=4326;POINT(-76.000000
39.000000)'),
) as distance;
} % )
}
end
然而,当我打电话
Vendor.close_to(39.000000, -76.000000).dist
它没有给我四行的距离,实际上会引发语法错误。我是新手rails和postgres开发者。我相信我的概念完全错了。请求帮助我纠正它,如何从特定范围内的给定坐标中找到附近的供应商,以及从给定的坐标中找出供应商附近的每个供应商之间的距离