2014-12-04 3 views
0

У моей модели ActiveRecord PaperTrail::Version есть поле с именем whodunnit типа text.ActiveRecord where.not в текстовом поле в PostgreSQL

Я хочу сделать 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... 

Как я должен изменить свой запрос, чтобы заставить его работать в обеих базах данных?

ответ

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

Postgres не изменяет заданное целое число в строку, прежде чем пытаться применить его к запросу. Простое изменение 4 на «4» должно решить проблему.

PaperTrail::Version.where.not(:whodunnit => '4') 

Я пошел вперед и проверил это на моей локальной системе только сейчас, и она работает, чтобы передать целое число в запрос с использованием Postgres 9.3.5. Какую версию вы используете?

+0

Это версия 9.3.3 (на Heroku) – fiddler

+0

Да, просто измените 4 на '4' (или 4.to_s, как сказал khampson), и он должен работать. –

Смежные вопросы