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