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

标签 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...'))

我收到这个错误:

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_routing 做了一些我不想触及的非常复杂的事情。如果必须的话,我会启动一个新的 linode 并在其上运行代码,但这似乎有点浪费,而且可能更像是一种失败。

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

其他说明:

  • 我在 rgeo 中使用的几何工厂是“Geos”
  • 几何是笛卡尔几何,而不是地理

类似的问题(作为一个被 ORM 搞得瘫痪的 Rails 开发人员,这些问题仍然让我摸不着头脑):

最佳答案

我从未使用过 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)

关于sql - 在rails或sql中克服 "ActiveRecord::StatementInvalid: PG::AmbiguousFunction"的方法。 (st_intersects 不是唯一的函数名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32786536/

相关文章:

node.js - 使用 postgres 从 heroku 中提取数据

python - 如何使用 Django 1.10 将数据从 html 表单存储到 postgres 数据库?

mysql - 如何从两个不同的表计算(数量*价格)的总和?

ruby-on-rails - Ruby on Rails 堆栈级别太深

mysql - 按时间顺序对连接中的数据进行排序以获得最新条目

ruby-on-rails - Ruby/Rails Net::HTTP.post_form 嵌套哈希项 html 转义

mysql - ruby ActiveRecord : Insert to parent and child tables in single commit

sql - 每组最高,有计数

sql - 在 SQL Server 中选择数据库名称和扩展属性

mysql - 不同条件的额外列