Rails 3 - добавление отказоустойчивого индекса для обеспечения уникальности возможных дубликатов

У меня вопрос по рельсам, на который я не смог найти ответ самостоятельно. Я прошу прощения, если это очень просто или очевидно, я полный новичок здесь.

Поэтому в моей базе данных есть столбец с именем:client_code, который определен в модели как конкатенация первого символа:first_name и:last_name в нижнем регистре. Так, например, если я открою новую форму и введу "Джон" для:first_name и "Доу" для:last_name,:client_code автоматически присваивается значение "jdoe". Вот соответствующая часть кода модели:

class Client < ActiveRecord::Base

  before_validation :client_code_default_format
  validates_presence_of :first_name, :last_name, :email
  validates_uniqueness_of :client_code

  ...


  def client_code_default_format
    self.client_code = "#{first_name[0]}#{last_name}".downcase
  end
end

Я хотел бы добавить что-то в этот код, чтобы в случае, если кто-то входит в другой клиент с таким же точным именем, он не проходит проверку уникальности, а создает слегка измененный код:client_code (например, "jdoe2")). Я мог бы, вероятно, выяснить, как добавить индекс ко всем из них, но я бы предпочел включать числа только в качестве отказоустойчивых в случае дубликатов. Может кто-то указать мне верное направление?

2 ответа

Решение

Большое спасибо @Dieseltime за его ответ. Я принял его предложение и смог получить желаемую функциональность с некоторыми незначительными изменениями:

before_validation :format_client_code
validates_presence_of :first_name, :last_name, :email, :company_id
validates_uniqueness_of :client_code

...

def format_client_code
  unless self.client_code != nil
    default_client_code = "#{first_name[0]}#{last_name}".downcase
    count = Client.count(:conditions => "client_code = '#{default_client_code}'")
    if count == 0
      self.client_code = default_client_code
    else
      self.client_code = default_client_code + (count + 1).to_s
    end
  end
end

Расчет количества текущих совпадений Client объекты с одинаковым client_code должно сработать

def client_code_default_format
  preferred_client_code = "#{first_name[0]}#{last_name}".downcase
  count = Client.count(:conditions => "client_code = #{preferred_client_code}")
  self.client_code = count == 0 ? preferred_client_code : preferred_client_code + count
end
Другие вопросы по тегам