在rails或sql中克服"ActiveRecord::StatementInvalid: PG::AmbiguousFunction"的方法。 (st_intersects 不是唯一的函数名称)

Methods of overcoming "ActiveRecord::StatementInvalid: PG::AmbiguousFunction" in rails or sql. (st_intersects is not a unique function name)

当我在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 函数正在传递第二个参数 'unknown'。也许我可以 "cast" 让它工作...?

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

我运行在 Ubuntu“12.04 LTS”VPS.

上使用 postgresql 和 postgis rails 服务器

我很确定我可以重新安装 postgis,但这会清除我的承包商的代码,这些代码用 pg_routing 做一些我不想碰的非常复杂的事情。如果必须的话,我会启动一个新的 linode 和 运行 上面的代码,但这似乎有点浪费,也许更像是一种失败。

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

其他说明:

类似的问题(作为一个 rails 被 ORM 削弱的开发人员,这些问题仍然让我摸不着头脑):

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

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

boolean ST_Intersects( geometry geomA , geometry geomB );

boolean ST_Intersects( geography geogA , geography geogB );

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

要在 PostgreSQL 中做到这一点,只需在值后使用“::”,如:

几何:

SELECT ST_Intersects('POINT(0 0)'::geometry, 'LINESTRING ( 0 0, 0 2 )'::geometry);

因此请确保值 :the_geombuffer 都匹配 geometry 类型,您应该没问题。也许 ActiveRecord 有办法显式更改类型?或者您可以将查询直接写入 PostgreSQL?

(来源:http://postgis.net/docs/ST_Intersects.html