Ruby PostgreSQL中文本字段上的ActiveRecord where.not
我的ActiveRecord模型Ruby PostgreSQL中文本字段上的ActiveRecord where.not,ruby,postgresql,rails-activerecord,Ruby,Postgresql,Rails Activerecord,我的ActiveRecord模型PaperTrail::Version有一个名为whodunnit的字段,类型为text 我想在此字段上进行where.not查询: PaperTrail::Version.where.not(:whodunnit => 4) 这在SQLite上运行良好,但如果在PostgreSQL上失败: 2014-12-04T07:21:42.484139+00:00 app[web.1]: ActionView::Template::Error (PG::Undef
PaperTrail::Version
有一个名为whodunnit
的字段,类型为text
我想在此字段上进行where.not
查询:
PaperTrail::Version.where.not(:whodunnit => 4)
这在SQLite上运行良好,但如果在PostgreSQL上失败:
2014-12-04T07:21:42.484139+00:00 app[web.1]: ActionView::Template::Error (PG::UndefinedFunction: ERROR: operator does not exist: character varying <> integer
2014-12-04T07:21:42.484142+00:00 app[web.1]: LINE 1: ....("versions"."whodunnit" != 4) ORD...
2014-12-04T07:21:42.484139+00:00应用程序[web.1]:操作视图::模板::错误(PG::未定义函数:错误:运算符不存在:字符可变整数
2014-12-04T07:21:42.484142+00:00应用程序[网站1]:第1行:…(“版本”。“whodunnit”!=4)ORD。。。
我应该如何更改查询以使其在两个数据库上都工作?看起来SQLite正在为您隐式地将varchar
转换为整数。Postgres不会这样做,以减少意外数据丢失/意外行为的机会
在Postgres中,您可以使用:
将整数显式转换为varchar
,或者使用:
将整数显式转换为varchar
(尽管从上面的错误可以看出,您的Postgres模型将其转换为文本
类型,这是Postgres特有的,尽管在许多方面它的行为类似于varchar
)
我认为在不使用特殊大小写的情况下,最直接的方法是将4
转换为字符串,我希望Rails随后生成更兼容的SQL
比如说:
PaperTrail::Version.where.not(:whodunnit => 4.to_s)
Postgres在尝试将给定整数应用于查询之前不会将其更改为字符串。只需将4更改为“4”即可解决此问题
PaperTrail::Version.where.not(:whodunnit => '4')
我刚刚在本地系统上测试了这个,它可以使用Postgres 9.3.5将一个整数传递到查询中。您使用的是哪个版本?那是9.3.3版(在Heroku上)是的,只需将4改为“4”(或者像坎普森说的4.0),它应该可以工作。