Rails - заглавные буквы силового поля и уникальная проверка - PullRequest
10 голосов
/ 22 февраля 2011

Аэропорты имеют четырехбуквенные коды ИКАО.По соглашению, они всегда в верхнем регистре.Я создаю форму для получения пользовательского ввода, но эта форма должна иметь возможность принимать пользовательский ввод в смешанном регистре и предотвращать создание дубликатов.

Значение по умолчанию :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

Ответы [ 4 ]

10 голосов
/ 22 февраля 2011

Или немного другой подход: напишите установщик для icao, который преобразует все, что выбрасывается в него, в верхний регистр:

def icao=(val)
    self[:icao] = val.upcase
end

И затем вы можете использовать обычную проверку уникальности ( создайте резервную копию с помощьюуникальный индекс в вашей БД ).Это может даже облегчить работу БД во время поиска, потому что ей больше не нужно беспокоиться о сравнении без учета регистра.

Надеюсь, это поможет!

7 голосов
/ 22 февраля 2011

попробуйте это:

validates :icao, :uniqueness => { :case_sensitive => false }
5 голосов
/ 10 июня 2015

Обновленный ответ для Rails 4.

class Airport < ActiveRecord::Base
  validates :icao, :name, :lat, :lon, :presence => true
  validates :icao, :uniqueness => { case_sensitive: false }

  def icao=(val)
    write_attribute :icao, val.upcase
  end
end
2 голосов
/ 22 февраля 2011

Просто исправлено (как и многие проблемы с Rails) - как указал Дэнни выше, хотя и не в своем собственном ответе, поэтому я не могу принять его :), изменение before_save на before_validation исправляет это совершенно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...