рельсы проверки уникальности при обновлении - PullRequest
3 голосов
/ 24 декабря 2011

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

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? Итак, почему эта проверка не проходит при обновлении?

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

1 Ответ

5 голосов
/ 24 декабря 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...