2

Order by Nearest - PostGIS、GeoRuby、spatial_adapter で見つけた回答が解決策を提供できなかったため、この質問をしています。特定のレコードの lonlat に最も近いn 個のレコードを返すことができるコントローラー メソッドを作成しようとしています。クエリ対象のレコードは同じテーブルからのものです。これを完全に 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: エラー: "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 に答える