2011-12-24 5 views
3

У меня есть следующее правило проверки на одной из моделей,рельсы проверки уникальности при обновлении

validates :reciept_num, :presence => true, 
         :numericality => { :only_integer => true }, 
         :uniqueness => true, 
         :on => :update, 
         :if => "!status_id.nil?"` 

Теперь, когда я обновляю объект с помощью метода update_attributes он дает мне следующее сообщение об ошибке

reciept_num: has already been taken.

При обновлении объекта я не изменяю атрибут reciept_num? Итак, почему эта проверка не выполняется при обновлении?

Если я не обновляю значение, он должен быть старым и, следовательно, должен пройти проверку. Я что-то упускаю.

ответ

5

Прежде всего, проверки не выполняются в зависимости от того, был ли изменен атрибут или нет (если, конечно, вы не просите об этом явно). Каждый раз, когда сохраняется запись с подтверждением уникальности и может выполняться валидация (как определено параметрами :on, :if, :unless), он проверяет, есть ли какие-либо экземпляры, кроме себя, со значением, которое должно быть уникальным.

Поскольку у вас есть условия для проверки, я думаю, вы можете создать два экземпляра с одинаковым номером чека, но где оба имеют нуль status_id. Установите столбец status_id и действия проверки на работоспособность и найдите другие экземпляры.

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

Я только догадываюсь о точном сценарии.

+0

благодарит за ваш ответ. после прочтения этого мне пришло в голову, что у данных семян, которые я создал, были двойные записи. – robert

+1

И, ': uniqueness => true' на самом деле не гарантирует уникальность даже без условий, для этого вам нужно уникальное ограничение внутри базы данных. –

+0

Му слишком короткая, вы можете уточнить? – maletor

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