AuthLogic + PostgreSQL 8.4: persistence_token определяется как строка, затем используется как целое число - PullRequest
3 голосов
/ 29 ноября 2010

Я пытаюсь интегрировать AuthLogic в мое приложение rails, и я последовал примеру, который определяет persistence_token как строку:

https://github.com/binarylogic/authlogic_example

Однако, когда я запускаю его с PostgreSQL 8.4на моем рабочем столе Ubuntu я получаю следующую ошибку:

ActiveRecord::StatementInvalid in UsersController#index

PGError: ERROR:  operator does not exist: character varying = integer
LINE 1: ...* FROM "users" WHERE ("users"."persistence_token" = 21007622...
                                                             ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
: SELECT * FROM "users" WHERE ("users"."persistence_token" = 2100762299)  LIMIT 1

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

Я уверен, что это должно быть распространенной проблемой, но поиск в Google не очень помог, есть идеи, как решить эту проблему?

Версия Ruby: 1.8.7 Версия Rails: 2.3.5 Версия AuthLogic: 2.1.6

Ответы [ 2 ]

1 голос
/ 26 октября 2012

Это проблема, потому что строки в вашей таблице имеют значение «persistence_token» nil. Установка значения столбца приведет к исчезновению этой ошибки. Я подозреваю, что это как-то связано с тем, как rails проверяет столбцы таблицы и его взаимодействие с authlogic.

0 голосов
/ 09 февраля 2011

Можете ли вы показать код, который объявляет persistence_token?

Сначала я бы попробовал приведение типов и преобразования.На стороне SQL все это будет работать.

 WHERE ("users"."persistence_token" = cast(2100762299 as varchar))
 WHERE ("users"."persistence_token" = 2100762299::text)
 WHERE ("users"."persistence_token" = text(2100762299))
 WHERE ("users"."persistence_token" = 2100762299 || '')

Последнее является неявным приведением типов.Это заставляет PostgreSQL обрабатывать число как строку, объединяя его в пустую строку.

Но вам может потребоваться изменить тип данных во время выполнения в Ruby.

yournumber.to_s
...