我的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...
如何更改查询以使其在两个数据库上都有效?
答案 0 :(得分:1)
看起来 SQLite 意味着将varchar
强加给integer
。 Postgres 不会这样做,以减少意外数据丢失/意外行为的机会。
在 Postgres 中,您可以使用integer
从varchar
明确地投射到::<type>
,反之亦然。 (虽然从上面的错误中可以看出, Postgres 模型将其作为text
类型,具体为 Postgres ,但在很多方面它的行为类似于varchar
。)
我怀疑没有特殊套管的最直接的方法是将4
转换为字符串,我希望 Rails 然后生成更兼容的SQL
所以,像这样:
PaperTrail::Version.where.not(:whodunnit => 4.to_s)
答案 1 :(得分:1)
Postgres在尝试将其应用于查询之前不会将给定的整数更改为字符串。只需将4更改为'4'即可解决问题。
PaperTrail::Version.where.not(:whodunnit => '4')
我刚才在我的本地系统上进行了测试,并使用Postgres 9.3.5将整数传递给查询。你使用的是哪个版本?