3

我有一个带有名为 shape 的多边形列的 postgres 表。为了确定一个点是否在里面,我跑

select * from areas where shape @> point '(1,1)';

这一切都很好,并且在我的 ruby​​ on rails 应用程序中工作,但在我的 RSpec 测试中失败了。当我查看我的日志时,我发现此错误是源

 PGError: ERROR:  operator does not exist: character varying @> point
 HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.

使用数据库的所有其他 50 多个测试都可以工作,只有这一个可以使用。它再次在代码和控制台中工作。测试环境全部设置妥当。

我的问题: - 我怎样才能使比较对象起作用?- 为什么它只会在测试中失败?

4

2 回答 2

5

默认情况下,activerecord 使用 schema.rb 使测试数据库与您的开发数据库保持同步。Schema.rb 是独立于数据库的(它使用与迁移相同的结构),但另一方面是它并不倾向于支持数据库可能拥有的所有花里胡哨,尤其是像 Postgres 这样添加了很多额外内容的数据库。

您可以config.active_record.schema_format改为:sql使用数据库自​​己的工具生成一个 .sql 文件,rails 将丢失该文件而不是 schema.rb。您将失去针对不同数据库运行测试的能力,但如果您使用的是 postgres 特定扩展,那么无论如何您都处于这种情况。

另一种可能性是增强活动记录的模式转储器以了解多边形列。例如,外国人 gem 将外键支持添加到 schema.rb

于 2012-10-04T07:02:20.430 回答
1

该错误似乎表明该shape列被定义为 varchar。检查以确保它是一个多边形。

\d areas
于 2012-10-04T04:14:06.773 回答