空间查询中的语法错误?

时间:2018-08-23 14:30:44

标签: ruby-on-rails-3 postgis

我编写了一个函数,用于查找轨道周围的所有点

控制器:

def index
  @track = Track.friendly.find(params[:track_id])
  @tracks = Track.where(way_id: @track.id)
  @way = Way.find(1)
  @poi_start = Poi.find(@way.point_start)
  @pois = @track.pois.sleepsAndtowns
  @pois = @way.poi_around_track_from(@poi_start, 50000, @pois)
end

way.rb

def poi_around_track_from(poi, dist, pois)
  around_sql = <<-SQL
  SELECT
  ST_DWithin(
    ST_LineSubstring(
    way.path,
    ST_LineLocatePoint(way.path, pta.lonlat::geometry) + #{dist} / ST_Length(way.path::geography),
    ST_LineLocatePoint(way.path, pta.lonlat::geometry) + 100000 / ST_Length(way.path::geography)
  ),
  ptb.lonlat,
  2000) is true as pois
  FROM ways way, pois pta, pois ptb
  WHERE way.id = #{self.id}
    and pta.id = #{poi.id}
    and ptb.id = #{pois.ids}
  SQL
  Poi.find_by_sql(around_sql).pois
end

此函数返回: “ [”或附近的语法错误 第13行:和ptb.id = [1、2、3、4、5、6、7、8、9、10、11]

怎么了,我该如何解决?

2 个答案:

答案 0 :(得分:1)

由于您使用的是标准sql(而不是ActiveRecord)来构建查询,因此您必须将标准IN线索与where一起使用

pois.ids似乎正在返回数组,因此,您必须将其转换为以下格式的字符串

[1,2] #=> (1,2)

更改

WHERE way.id = #{self.id}
    and pta.id = #{poi.id}
    and ptb.id = #{pois.ids}

WHERE way.id = #{self.id}
    and pta.id = #{poi.id}
    and ptb.id IN (#{pois.ids.join(',')})

答案 1 :(得分:0)

您可以像@ semeera207写入字符串一样更改pois.id,也可以采用另一种方式将ptb.id与pois.ids作为数组进行比较。

  WHERE way.id = #{self.id}
and pta.id = #{poi.id}
and array[ptb.id] && #{pois.ids}

为了更快地创建杜松子酒指数

Create index on pois using gin((array[id]));