Направляющие “validates_uniqueness_of” чувствительность к регистру

Я изменил свой подход к задаче после советов других людей. Я вставляю INTO только сгруппированные данные вместо INSERT INTO в каждую строку.

Примерно так:

СОЗДАНИЕ ИЛИ ЗАМЕНА ПРОЦЕДУРЫ XTS.GET_PROFILE_AGGR
AS
CURSOR time_series_cur IS выбирает отличное имя_кластера_таблицы как res из xts.time_serie;

BEGIN  
  for time_series_rec in time_series_cur  
  LOOP  
    Execute immediate 'INSERT INTO HDO.tmp_profiles_overview (id_profile, cnt, d_min, d_max) select time_series_id, count(*), min(time), max(time) from ' || time_series_rec.res || ' group by time_series_id';  

  END LOOP;  

commit;   
END;
88
задан Nakilon 20 January 2011 в 08:53
поделиться

2 ответа

validates_uniqueness_of :name, :case_sensitive => false добивается цели, но необходимо иметь в виду это validates_uniqueness_of не гарантирует уникальности, если у Вас будет несколько серверов/серверных процессов (например, выполняющий Пассажира Phusion, несколько Полукровок, и т.д.) или многопоточный сервер. Поэтому Вы могли бы получить эту последовательность событий (порядок важен):

  1. Процесс A заставляет запрос создавать нового пользователя с именем 'нечто'
  2. Процесс B делает то же самое
  3. Процесс A проверяет уникальность 'нечто' путем выяснения у DB, если то имя существует уже, и DB говорит, что имя еще не существует.
  4. Процесс B делает то же самое и получает тот же ответ
  5. Процесс A отправляет insert оператор для новой записи и успешно выполняется
  6. Если у Вас будет ограничительная уникальность требования базы данных для того поля, то Процесс B отправит insert оператор для новой записи и сбоя за ужасным исключением сервера, которое возвращается из адаптера SQL. Если у Вас не будет ограничения базы данных, то вставка успешно выполнится, и у Вас теперь есть две строки с 'нечто' как имя.

См. также "Параллелизм и целостность" в validates_uniqueness_of Документация направляющих.

От Ruby on Rails 3-й выпуск:

... несмотря на его имя, validates_uniqueness_of действительно не гарантирует, что значения столбцов будут уникальны. Все, что это может сделать, проверяют, что никакой столбец не имеет то же значение как это в записи, проверяемой в то время, когда проверка выполняется. Для двух записей возможно быть созданным одновременно, каждый с тем же значением для столбца, который должен быть уникальным, и для обеих записей для передачи проверки. Самый надежный способ осуществить уникальность с ограничением уровня базы данных."

См. также опыт этого программиста с validates_uniqueness_of.

Одним путем это обычно происходит, случайные двойные представления от веб-страницы при создании новой учетной записи. Это - твердое для решения, потому что то, что возвратит пользователь, является второй (ужасной) ошибкой, и она заставит их думать своя отказавшая регистрация, когда в действительности она успешно выполнилась. Лучшим способом я нашел для предотвращения, это должно только использовать JavaScript, чтобы попытаться предотвратить двойное представление.

226
ответ дан Jordan Brough 24 November 2019 в 07:23
поделиться

Существует опция, где можно указать нечувствительность к регистру

  validates_uniqueness_of :name, :case_sensitive => false
23
ответ дан vrish88 24 November 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: