/ / рейки перевірки унікальності на оновлення - рубін на рейках, рубін на рейках-3

Рейки перевірки унікальності на оновлене - рубін на рейках, рубін на рейках-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 за відповідь № 1

По-перше, перевірки не проводяться на основі того, чи єатрибут змінився чи ні (якщо ви, звичайно, не запитуєте це явним чином). Everytime запит з перевіркою унікальності зберігає і перевірку може запускатися (як визначено :on, :if, :unless параметри), він перевірить, чи існують якісь екземпляри, крім самого себе, значення, яке має бути унікальним.

Оскільки у вас є умови для вашої перевірки, я думаю, що ви можете створити два екземпляри з тим самим номером, але там, де обидва мають нуль status_id. Встановіть status_id стовпець і перевірка вказує на дію і знаходить інші випадки.

Інша справа, що оскільки ваша перевірка виконується лише на оновлення, ви можете створити кілька екземплярів з тим самим номером для отримання, знову намагаючись оновити запис, ініціюватиме перевірку.

Я лише здогадуюсь за точними сценаріями.