Столбец ActiveRecord не существует - PullRequest
2 голосов
/ 19 марта 2012

У меня есть приложение Rails, использующее базу данных Postgres с таблицей geolite_blocks. Если я позвоню 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)

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

1 Ответ

6 голосов
/ 19 марта 2012

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

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

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

Это:

GeoliteBlock.find_by_startIpNum 2776360991

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

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

...