Błąd 'Duplicate entry' w Ruby on Rails

06 Nov 2011 | Adam Przymusiała

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!

Czytaj dalej: