Проблема с validates_uniqueness_of - PullRequest
       27

Проблема с validates_uniqueness_of

0 голосов
/ 19 января 2011

Я использую rails 2.3.5 и Authlogic на нашем веб-сайте, и я получаю ошибки в базе данных из-за надежды пользователей с дублированными электронными письмами, пытающимися быть сохраненными.Проблема, очевидно, у меня validates_uniqueness_of :email на модели.

На моих тестах, находящихся в разработке, я получаю ожидаемую ошибку проверки, и пользователь не сохраняется, но на работе я продолжаю получать эти ошибкислой БД.

Я проверил с чувствительными к регистру электронными письмами, и это также проверило правильно.

Я проверил и класс, и нет attr_accessor или любого другого атрибута переопределения, и яне думайте, что Authlogic сделает это неправильно ...

Что может происходить на производстве?Есть ли случаи, когда проверка рельсов не работает?

Ответы [ 3 ]

1 голос
/ 22 октября 2011

Найдите SQL, выполняющий validates_uniqueness_of, в своем журнале разработки, и если вы видите что-то вроде WHERE (email = BINARY 'foo@example.com'), попробуйте создать пользователя с FOO@EXAMPLE.COM, и теперь вы можете воспроизвести исключение дублирования на уровне базы данных.

Чтобы исправить это, введите следующий код в config/initializers/patches.rb:

class ActiveRecord::ConnectionAdapters::Mysql2Adapter
  def case_sensitive_equality_operator
    "="
  end
end

Обратите внимание, что Mysql2Adapter должно быть MysqlAdapter, если вы находитесь на Rails 2.

На сторонеобратите внимание, это давняя ошибка в Rails IMO - обработка чувствительности к регистру на уровне Ruby вообще не имеет смысла.Если вам нужен поиск с учетом регистра, у вас должно быть сопоставление столбцов utf8_bin.Если вам нужен поиск без учета регистра, у вас должно быть сопоставление столбцов utf8_general_ci.Применение функции BINARY в предложении where отключит использование индекса, а validates_uniqueness_of вызывает полное сканирование таблицы каждый раз, когда вы пытаетесь создать / обновить запись.Если у вас есть миллионы записей, вы полностью испорчены.Патч выше исправит это тоже - на самом деле, это была моя первоначальная мотивация для создания этого патча.

Если вы согласны, пожалуйста, +1 к https://github.com/rails/rails/issues/1399:)

0 голосов
/ 19 января 2011

Просто предположение, но может ли быть так, что ваш столбец электронной почты допускает нулевое значение, validates_uniqueness_of игнорирует нулевые (или пустые) значения и что ваши пользователи пытаются зарегистрироваться без указания своих адресов электронной почты?

0 голосов
/ 19 января 2011

Вы пытались воссоздать сценарий. Почему следует выдавать ошибки, которые требуют уведомления Hoptoad. Я имею в виду, в основном, если у вас есть, он не должен сохранять пользователя и не выдавать ошибку для hoptoad, чтобы уведомить вас о.

Также с authlogic я не думаю, что вы должны указывать validate_uniqueness_of для электронной почты. Обычно authlogic позаботится об этом за вас.

Так что я думаю, тебе пора глубоко нырять.

Посмотрите журналы и попробуйте воссоздать эту ошибку локально. Всегда лучше повторить шаги, ведущие к ошибке.

Более подробная информация, стек ошибок, код определенно будет полезен.

...