2013-06-19 4 views
0

У меня есть часть кода, отлично работающая в среде разработчиков и вызывающая ошибку при производстве. Вот оно:Ошибка Heroku PG при выборе

venue.badges.where(:active => true).select([:title, :desc, :bonus]).each do |badge| 

Во время работы над MySQL локальной БД, она выстреливает это в производстве:

ActiveRecord::StatementInvalid (PG::Error: ERROR: syntax error at or near "desc" 
: SELECT title, desc, bonus FROM "badges" WHERE "badges"."venue_id" = 22 AND "badges"."active" = 't'): 
LINE 1: SELECT title, desc, bonus FROM "badges" WHERE "badges"."ven... 

Я действительно не понимаю, что здесь не так.

+0

Одна вещь, которая является неправильным заключается в том, что вы разрабатываете поверх одной базы данных и развертываете поверх другого, это всего лишь сокращение от боли и страданий. Существует много тонких различий между базами данных, и никакая ORM не защитит вас от этих различий. –

ответ

2

DESC - зарезервированное ключевое слово в SQL. This list of SQL and PostgreSQL keywords - хорошая рекомендация. Чтобы использовать зарезервированное слово в качестве имени столбца вам нужно избежать его в двойные кавычки:

SELECT title, "desc", bonus FROM badges WHERE ... 

И в рельсах, передать его как буквенная строка, а не символ:

venue.badges.where(:active => true).select([:title, '"desc"', :bonus]).each do |badge| 
+1

Или лучше, переименуйте столбец в то, что не является зарезервированным словом, что будет в меньшей степени болезненным в долгосрочной перспективе. –

+0

Спасибо, ребята! Вы мне очень помогли! –

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