2016-07-14 33 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) 

您應該找到此作品。

相關問題