ActiveRecord where.not在PostgreSQL中的文本字段

时间:2014-12-04 07:35:30

标签: 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::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...

如何更改查询以使其在两个数据库上都有效?

2 个答案:

答案 0 :(得分:1)

看起来 SQLite 意味着将varchar强加给integer Postgres 不会这样做,以减少意外数据丢失/意外行为的机会。

Postgres 中,您可以使用integervarchar明确地投射到::<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将整数传递给查询。你使用的是哪个版本?