Rails 3 - добавление индекса отказоустойчивости для обеспечения уникальности возможных дубликатов - PullRequest
0 голосов
/ 25 февраля 2012

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

Так что у меня есть столбец в моей базе данных с именем: client_code, который определен в модели как конкатенация первогосимвол: имя_фамилия и имя_фамилия.Например, если я открою новую форму и введу «Джон» для: 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 ]

1 голос
/ 26 февраля 2012

Большое спасибо @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
1 голос
/ 25 февраля 2012

Вычисление количества текущих совпадающих 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
...