2016-07-14 3 views
2

​​で見つかった回答は解決策を提供できませんでしたので、私はこの質問をしています。私はnのレコードを特定のレコードのlonlatに返すことができるコントローラメソッドを作成しようとしています。照会しているレコードは同じテーブルからのものです。私がこれをSQLで完全に実行していた場合、このコンセプトはそれほど大きなものではありません。その多くがリンクされている例では明らかであり、以下に私は結果を得られる特定のケースである:ご注文はお近くのPostGIS、RGeo、Spatial Adapter

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) 

これはわかります。

関連する問題