我有一个postgres表,其中包含一个名为shape的多边形列。为了确定一个点是否在我内部运行
select * from areas where shape @> point '(1,1)';
这一切都很好并且在我的ruby on rails app上工作,但它在我的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多个测试,只有这一个保释。它再次适用于代码和控制台。测试环境都已正确设置。
我的问题: - 我如何投射比较科目? - 为什么它只会在测试中失败?
答案 0 :(得分:5)
默认情况下,activerecord使用schema.rb使测试数据库与开发数据库保持同步。 Schema.rb是数据库独立的(它使用与迁移相同的结构),但另一方面是它不支持数据库可能具有的所有花里胡哨,特别是像Postgres这样增加了许多额外的东西。
您可以将config.active_record.schema_format
设置为:sql
,而不是使用数据库自己的工具来生成rails将丢失的.sql文件,而不是schema.rb。您将无法针对不同的数据库运行测试,但如果您使用的是postgres特定的扩展,那么无论如何您都处于该场景中。
另一种可能性是增强活动记录的模式转储器以理解多边形列。 foreigner gem为schema.rb添加了外键支持,例如
答案 1 :(得分:1)
该错误似乎表明shape
列被定义为varchar。检查以确保它是多边形。
\d areas