2

我问这个问题是因为我在按最近排序 - PostGIS、GeoRuby、spatial_adapter中找到的答案无法提供解决方案。我正在尝试创建一个控制器方法,该方法可以将n 个最接近的记录返回到某个记录的 lonlat。它查询的记录来自同一个表。如果我完全在 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: 在“LIMIT”或附近出现语法错误 10:29:50 rails.1 LINE 1: ...lonlat, ST_PointFromText("#{unit.lonlat.as_text)}")限价 1 美元

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

4

1 回答 1

3

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

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

你应该会发现这很有效。

于 2016-07-14T15:47:44.463 回答