2012-03-19 1 views
2

У меня есть приложение Rails, использующее базу данных Postgres с таблицей geolite_blocks. Если я вызываю ActiveRecord следующим образом:Столбец ActiveRecord не существует

GeoliteBlock.find_by_startIpNum 2776360991 

Запрос работает отлично. Однако, если я делаю запрос так:

GeoliteBlock.where("startIpNum >= ?", 2776360991) 

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

ActiveRecord::StatementInvalid: PGError: ERROR: column "startipnum" does not exist 
LINE 1: ... "geolite_blocks".* FROM "geolite_blocks" WHERE (startIpNum... 
                  ^
: SELECT "geolite_blocks".* FROM "geolite_blocks" WHERE (startIpNum >= 2776360991) 

Но я знаю, что столбец существует, потому что я просто запрашиваться его с первым примером кода. Любые идеи относительно того, почему это может происходить, и как я могу это устранить? Спасибо за любую помощь!

ответ

4

Имена столбцов в SQL нечувствительны к регистру, если только они не были указаны при их создании. Кто-то создал свой startIpNum колонку с кавычками вокруг него, так что вы должны процитировать его каждый раз, когда вы используете его:

GeoliteBlock.where('"startIpNum" >= ?', 2776360991) 

Ошибка вы получаете от PostgreSQL упоминает startipnum, потому что PostgreSQL нормализует идентификаторы в нижний регистр (стандарт SQL говорит что они должны быть нормированы на верхний регистр, хотя).

Это:

GeoliteBlock.find_by_startIpNum 2776360991 

работает, потому что AR процитирую startIpNuM часть за спиной. Аналогично, также будет работать GeoliteBlock.where(:startIpNum => 2776360991).

Я бы рекомендовал вам изменить схему, чтобы использовать имена столбцов нижнего регистра, чтобы вам больше не пришлось беспокоиться об этом.

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

  • Нет связанных вопросов^_^