代码之家  ›  专栏  ›  技术社区  ›  Ben

空间查询语法错误?

  •  0
  • Ben  · 技术社区  · 6 年前

    控制器:

    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
    

    路.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 回复  |  直到 6 年前
        1
  •  1
  •   sameera207    6 年前

    由于使用标准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(',')})
    
        2
  •  0
  •   Grzegorz Grabek    6 年前

    您可以在@semeera207写入字符串时更改pois.id,也可以使用其他方法将ptb.id与pois.id作为数组进行比较。

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

    为了更快地创建gin索引

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