使用 PostGIS、RGeo、空间适配器按最近点排序

Order by Nearest using PostGIS, RGeo, Spatial Adapter

我问这个问题是因为我在 Order by nearest - PostGIS, GeoRuby, spatial_adapter 中找到的答案无法提供解决方案。我正在尝试创建一个控制器方法,该方法可以 return n 最接近某个记录的 lonlat 的记录。它查询的记录来自同一个 table。如果我在 SQL 中完全这样做,这个概念就不是那么大了。链接示例中的内容很清楚,下面是我获得结果的具体情况:

condos_development=#
  SELECT id, name FROM condos
  ORDER BY ST_Distance(condos.lonlat, ST_PointFromText('POINT(-71.06 42.45)'))
condos_development-#
  LIMIT 5;

我的问题是如何使用 ActiveRecord 进行这项工作。我正在使用一种受 @dc10 的响应启发的方法,但我无法通过 RGeo 方法或直接 SQL 创建工作查询。这是我目前所拥有的:

def find_closest_condos(num, unit)
  result = Condo.order('ST_Distance(condos.lonlat, ST_PointFromText("#{unit.lonlat.as_text)}")')
                .limit(5)
end

这次尝试的响应如下:

ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "LIMIT" 10:29:50 rails.1 LINE 1: ...lonlat, ST_PointFromText("#{unit.lonlat.as_text)}") LIMIT

有人可以让我走上正确的轨道,了解如何将这个工作查询放在一起,以便我可以在 Rails 中使用它吗?

问题在于活动记录如何将您的查询解析为 SQL,还有 Limit 子句的位置。如果您将查询更改为:

Condo.order("ST_Distance(lonlat, ST_GeomFromText('#{unit.lonlat.as_text}', 4326))")
     .limit(num)

你应该会发现这个有效。