Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 测试环境中未启用Postgresql扩展_Ruby On Rails_Postgresql_Rspec - Fatal编程技术网

Ruby on rails 测试环境中未启用Postgresql扩展

Ruby on rails 测试环境中未启用Postgresql扩展,ruby-on-rails,postgresql,rspec,Ruby On Rails,Postgresql,Rspec,我有一个postgres表,其中有一个多边形列,名为shape。为了确定点是否在内部,我运行 select * from areas where shape @> point '(1,1)'; 这在我的RubyonRails应用程序中运行良好,但在我的RSpec测试中失败。当我查看日志时,我发现这个错误是源代码 PGError: ERROR: operator does not exist: character varying @> point HINT: No opera

我有一个postgres表,其中有一个多边形列,名为shape。为了确定点是否在内部,我运行

select * from areas where shape @> point '(1,1)';
这在我的RubyonRails应用程序中运行良好,但在我的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多个使用DB的测试都有效,只有这一个无效。同样,它在代码和控制台中工作。测试环境都已正确设置

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

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

\d areas

默认情况下,activerecord使用schema.rb使测试数据库与开发数据库保持同步。Schema.rb是独立于数据库的(它使用与迁移相同的结构),但另一方面,它不支持数据库可能具有的所有功能,特别是像Postgres这样添加了大量额外内容的功能

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


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

您是否意外地在测试环境中使用了不同类型的数据库(例如mysql?@DavidGrayson:
PGError
表示PostgreSQL,所以我认为这不是问题所在。>您的测试数据库中是否加载了所有必要的PostgreSQL扩展?我没有为此做任何具体的事情。这是一种简单的几何类型,不需要对我的知识进行任何扩展;多边形演员将其固定。然后我发现在我的测试数据库中,列的形状是字符串。这就是它抱怨形状的原因。所以我放弃了我的db,运行rake db:dump来创建schema.rb,我的多边形类型再次是string。如何使其了解多边形?在数据库中,列肯定是多边形。在我的开发环境中,它是多边形,再次验证。当我运行rake db:schema:dump并查看schema.rb时,它又被归类为普通字符串。运行rake db:test:clone_结构。并且只使用“rspec”而不是“rake spec”运行测试,因为这将始终重新生成结构,并且无论如何都要慢得多。所以这是可行的。