Я маю наступне правило перевірки на одній з моделей,
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
стовпець і перевірка вказує на дію і знаходить інші випадки.
Інша справа, що оскільки ваша перевірка виконується лише на оновлення, ви можете створити кілька екземплярів з тим самим номером для отримання, знову намагаючись оновити запис, ініціюватиме перевірку.
Я лише здогадуюсь за точними сценаріями.