2016-07-14 38 views
2

我在问这个问题,因为我在​​找到的答案无法提供解决方案。我试图创建一个控制器方法,可以将最接近的记录返回到某个记录的lonlat。它所查询的记录来自同一张表。如果我完全在SQL中完成这个概念,那么这个概念并不是很大。这一点是在链接的例子清楚,下面是我获得的结果的具体情况:通过最近使用PostGIS,RGeo,Spatial Adaptor排序

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 $1

会有人可以把我对如何把这项工作查询在一起,使正确的轨道上我可以使它在Rails中工作?

+0

好像解决方案就是将''#{unit.lonlat.as_text}}''改为'“#{unit.lonlat.as_text}”' –

+0

是的。这是正确的。 – brianbancroft

回答

2

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

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

您应该找到此作品。

相关问题