具体的なコード
res = Restaurant.find(1) # Restaurantの中からid: 1のものを取得 r1 = res.location.to_s # res からGeometry型で保存されているlocationカラムを取得し、文字列に # 具体的には、"POINT (139.6479183406 35.5253746419)" a = Station.select("stations.*").where("st_dwithin(location, ?, 5000)", r1).order("st_distance(location, ?)", r1).first
これを実行すると
Station Load (0.9ms) SELECT stations.* FROM "stations" WHERE (st_dwithin(location, 'POINT (139.6479183406 35.5253746419)', 5000)) ORDER BY st_distance(location, ?, 5000), POINT (139.6479183406 35.5253746419) LIMIT $1
となり、ORDER BY st_distance(location, ?, 5000)
の箇所の?
に、適切に代入されていないことがわかる。
なぜでしょうか?しばらく試行錯誤したのですが、わかりませんでした。。
order の引数に直接文字列を入れると、もちろん動きます。ですので、これはrailsやmodelの問題ではなく、SQL文の書き方に問題があると思われますが、まだあまりSQL文の書き方を分かっておらず、困っています。よろしくお願いします。
-- 追記 --
r1 の部分を、無理やりSQL文内部で展開すると、動きます。
a = Station.select("stations.*").where("st_dwithin(location, ?, 5000)", r1).order("st_distance(location, '#{r1}')").first
しかしこれだと、SQLインジェクション?の問題が起こると思われるので、望ましくありません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/28 00:02