Аэропорты имеют четырехбуквенные коды ИКАО. По соглашению, они всегда имеют верхний регистр. Я создаю форму для ввода пользовательского ввода, но эта форма должна быть способна принимать пользовательский ввод в смешанном случае и препятствовать им создавать обманки.
По умолчанию :uniqueness
зависит от регистра, конечно. Я понял, как преобразовать пользовательский ввод в верхний регистр, прежде чем он будет сохранен, но проблема в том, что это скорее пост-валидация, а не предварительная проверка.
Например, если уже есть аэропорт с ИКАО KLAX
, пользователь может ввести KLAX
, он будет проверен как уникальный, а затем преобразован в верхний регистр и сохранен, что приведет к дублированию.
Вот мой код модели в настоящее время.
class Airport < ActiveRecord::Base
validates :icao, :name, :lat, :lon, :presence => true
validates :icao, :uniqueness => true
before_save :uppercase_icao
def uppercase_icao
icao.upcase!
end
end