在测试环境中未启用 Postgresql 扩展



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

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.

所有其他使用 DB 的 50+ 测试都可以工作,只有这一个可以保释。同样,它在代码和控制台中工作。 测试环境已全部正确设置。

我的问题:- 如何投射比较对象工作?- 为什么它只会在测试中失败?

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

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

另一种可能性是增强活动记录的架构转储程序以了解多边形列。例如,外星人 gem 向 schema.rb 添加了外键支持

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

d areas

最新更新