Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
克服的方法;ActiveRecord::语句无效:PG::AmbiguousFunction“;在rails或sql中。(st_intersects不是唯一的函数名)_Sql_Ruby On Rails_Postgresql_Postgis_Rgeo - Fatal编程技术网

克服的方法;ActiveRecord::语句无效:PG::AmbiguousFunction“;在rails或sql中。(st_intersects不是唯一的函数名)

克服的方法;ActiveRecord::语句无效:PG::AmbiguousFunction“;在rails或sql中。(st_intersects不是唯一的函数名),sql,ruby-on-rails,postgresql,postgis,rgeo,Sql,Ruby On Rails,Postgresql,Postgis,Rgeo,在rails中运行此命令时: CensusBlockGroup.where{st_interects(:the_geom, buffer)} 在SQL中运行此命令的: SELECT "census_block_groups".* FROM "census_block_groups" WHERE (st_intersects("census_block_groups"."proj_shape_3361", '002000000300000d2...')) 我得到了这个错误: ActiveRe

在rails中运行此命令时:

CensusBlockGroup.where{st_interects(:the_geom, buffer)}
在SQL中运行此命令的:

SELECT "census_block_groups".* FROM "census_block_groups"  WHERE (st_intersects("census_block_groups"."proj_shape_3361", '002000000300000d2...'))
我得到了这个错误:

ActiveRecord::StatementInvalid: PG::AmbiguousFunction: 
ERROR:  function st_intersects(geometry, unknown) is not unique
LINE 1: ...lock_groups".* FROM "census_block_groups"  WHERE (st_interse...
HINT:  Could not choose a best candidate function. You might need to add explicit type casts.
我不知道如何添加显式类型转换,老实说,我甚至不清楚这意味着什么。我看到上面的st_intersects函数在第二个参数“未知”中传递。也许我可以“铸造”它并让它工作

我认为问题可能在于,由于postgresql的“函数重载”特性,它的
st_intersects
有多个函数定义。我不是第一个在这个系统上安装postgresql/postgis的开发人员,我的一个承包商安装了,所以我担心我们可能重复了我们的工作

我正在Ubuntu“12.04 LTS”VPS上使用postgresql和postgis运行rails服务器

我很确定我可以重新安装postgis,但这会抹去我的承包商代码,这些代码在pg_布线方面做了一些非常复杂的事情,我不想碰它们。如果必须的话,我将启动一个新的linode并在其上运行代码,但这似乎是一种浪费,甚至更重要的是,这是一种失败

如果我无法通过消除歧义来正确解决问题(这通常适用于我在Mac和linux发行版上),我认为另一个解决方案是将postgresql标记为忽略歧义,只选择它遇到的第一个st_intersects函数

其他说明:

  • 我在rgeo中使用的几何体工厂是“Geos”
  • 几何是笛卡尔坐标系,而不是地理坐标系
类似的问题(作为一名被ORM弄得一筹莫展的rails开发人员,这些问题仍然让我挠头):


我从未使用过Rails,但实际上,在PostgreSQL中,函数ST_Intersects有一个覆盖,这意味着根据参数的类型,应该调用不同的函数

在这种情况下,这些是覆盖:

布尔ST_相交(几何geomA,几何geomB)

布尔ST_相交(geography geogA,geography geogB)

根据您显示的生成的查询,PostgreSQL可能很难确定要运行哪个函数,添加显式转换(一种指定特定值类型的方法)将告诉您应该调用哪个函数

要在PostgreSQL中执行此操作,请在值后使用“:”,如下所示:

几何图形:

SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry);
因此,请确保两个值
:_geom
buffer
都与几何体类型匹配,这样就可以了。也许ActiveRecord有办法显式更改类型?或者您可以直接将查询写入PostgreSQL


(来源:)

一旦我学会了如何做几件事,我就能够让它发挥作用。1.)我了解到我可以创建AR类作用域,然后运行#to#sql以获取要修改的sql代码2.)生成要使用方法(在我的例子中是lambda)执行的正确sql字符串。在我的例子中,我使用#as#u text方法3将二进制代码切换为WKT。在WKT文本中添加“EPSG=4326;”,以便postgis考虑正确的SRID。4.)通过
ActiveRecord::Base.connection.select_rows(sql)
运行原始sql,我对代码库中这个孤立的、极其复杂的领域并不感到非常兴奋,但老实说,作为一名rails GIS程序员,看到这个模糊的解决方案能够工作,我并没有那么烦恼。很高兴你得到了它!运行原始SQL语句时要小心SQL注入。在忘记如何解决这个问题后,我又回到了这个问题。如此简单的代码能够解决歧义问题<代码>其中(“st_相交(项目形状_4326,st_GeomFromText('#{shp.as_text}',4326))”