Rails 3.1 + база данных postgresql - синтаксическая ошибка sql для SELECT ... WHERE ... IN - PullRequest
0 голосов
/ 09 декабря 2011

У меня установлена ​​Rails 3.1 с postgres 8.4.Вот мои версии драгоценных камней:

activerecord (3.1.3)
  activemodel (= 3.1.3)
  activesupport (= 3.1.3)
  arel (~> 2.2.1)
  tzinfo (~> 0.3.29)
activerecord-jdbc-adapter (1.2.1)
activerecord-jdbcpostgresql-adapter (1.2.1)
  activerecord-jdbc-adapter (~> 1.2.1)
  jdbc-postgres (~> 9.0.0)

Теперь, когда я делаю этот запрос в моем контроллере:

@topics = Topic.find(:all, :conditions => ["\"ForumID\" in ?, @forum_ids]

Я получаю этоошибка:

ActiveRecord::JDBCError: ERROR: syntax error at or near "'abc123'"
Position: 62: SELECT "topic".* FROM "topic"  WHERE ("ForumID" in 'abc123','1234')
Completed 500 Internal Server Error in 314ms

ActiveRecord::StatementInvalid (ActiveRecord::JDBCError: ERROR: syntax error at or near "'abc123'"
Position: 62: SELECT "topic".* FROM "topic"  WHERE ("ForumID" in 'abc123','1234')):

Я думаю, проблема в том, где в операторе SQL ставится скобка.Это должно быть после в вместо «ForumID».

SELECT "topic".* FROM "topic" WHERE "ForumID" in ('abc123','1234') работает отлично, поэтому это ошибка в адаптере postgresql или я что-то не так делаю в своем запросе?

Спасибо.

Ответы [ 2 ]

4 голосов
/ 09 декабря 2011

Похоже, что в запросе отсутствуют круглые скобки.Так что этот должен работать:

@topics = Topic.find(:all, :conditions => ["ForumID in (?)", @forum_ids])

Поскольку вы находитесь на Rails 3.1, лучше использовать:

@topis = Topic.where("ForumID in (?)", @forum_ids)
0 голосов
/ 09 декабря 2011

Разве вы не хотите иметь

@topics = Topic.find(:all, :conditions => ["\"ForumID\" in ?", @forum_ids]

Обратите внимание на закрытие " в условиях.

В качестве примечания вы можете сделать это в Rails 3 с помощью

 @topics = Topic.where("\"ForumID\" in ?", @forum_ids)

И, возможно, даже (проверьте синтаксис)

@topics = Topic.where(:ForumID => @forum_ids)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...