Ruby PostgreSQL中文本字段上的ActiveRecord where.not

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

我的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::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),它应该可以工作。