空间查询中的语法错误?
Syntax error in spatial query?
我写了一个函数来找到轨道周围的所有位置
控制器:
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
这个函数return:
“[”处或附近的语法错误
第 13 行:并且 ptb.id = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
出了什么问题,我该如何解决?
由于您正在使用标准 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(',')})
您可以将 pois.ids 更改为 @semeera207 写入字符串或采用其他方式并将 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]));
我写了一个函数来找到轨道周围的所有位置
控制器:
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
这个函数return: “[”处或附近的语法错误 第 13 行:并且 ptb.id = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
出了什么问题,我该如何解决?
由于您正在使用标准 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(',')})
您可以将 pois.ids 更改为 @semeera207 写入字符串或采用其他方式并将 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]));