Od jakiegoś czasu w aplikacji zaczął pojawiać podczas zapisu i aktualizacji bazy danych tajemniczy błąd Mysql2::Error: Duplicate entry połączony z wyjątkiem ActiveRecord::RecordNotUnique. Powodowały go zabezpieczenia unikalności indeksów w bazie danych nie złapane przez aplikację.
Namierzenie i poprawienie go nie było tak oczywiste jak by się na pierwszy rzut oka wydawało; model miał obowiązkowe sprawdzanie unikalności wprowadzonej wartości validates_uniqueness_of, formularz nie pozwalał na wysłanie zaraz po sobie identycznych danych (:disable_with => '…'). Nie występował problem konkurencyjności zapisów.
Okazało się że walidacja validates_uniqueness_of w RoR domyślnie jest wrażliwa na wielkość liter a indeksy w MySQL nie :). Użytkownicy dodając rekordy o identycznej nazwie a innych wielkościach liter odbijali się od 500 powodowanej przez bazę danych.
Rozwiązaniem było dodanie do walidacji w modelu opcji niewrażliwości na wielkość liter
validates_uniqueness_of :email, :case_sensitive => false
lub
validates :name, :uniqueness => {:case_sensitive => false}
Dodaj komentarz!