2

Я хотел бы дать John Doe постоянная ссылка джона-МЭ-2, если уже есть джон-МЭ-1. Номер должен быть следующий свободный один, который будет добавлен («джон-doe- п»)Rails: Append номера для PermaLink, если постоянная ссылка уже принята

В настоящее время мои Permalinks генерируются обычным способом:

before_validation :generate_slug 
private 
def generate_slug 
    self.permalink = self.name.parameterize 
end 

Как реализовать validates_uniqueness_of-подобный метод, который добавляет этот номер к self.permalink, а затем сохраняет пользователя в обычном режиме?

ответ

3

Прежде всего, спросите себя: есть ли более простой способ сделать это? Я верю, что есть. Если вы уже готовы добавлять номера в свой слизень, как насчет добавления номера, например, идентификатора?

before_validation :generate_slug 

private 
def generate_slug 
    self.permalink = "#{self.id}-#{self.name.parameterize}" 
end 

Это очень надежный способ сделать это, и вы даже можете пройти слизняк непосредственно к find методе, что означает, что вы на самом деле не нужны, чтобы сохранить слизняк на всех.

В противном случае вы можете просто проверить, существует ли имя + номер, а затем увеличивать n на 1, а затем перепроверять, пока не найдете бесплатный номер. Обратите внимание, что это может занять некоторое время, если есть много записей с тем же именем. Этот способ также зависит от условий гонки, если одновременно производятся два слизняков.

+0

Спасибо dvyjones, в этом ориентированном на пользователя сумасшедшем случае, вероятно, было бы несчастливо иметь постоянную ссылку профиля, связанную с датой создания: ** user/4208-john-doe **, очевидно, был бы более новым для сайта, чем ** пользователь/1-джон-лань **. Итак, я бы выбрал второе решение, как бы вы это сделали в коде? – David

+1

Ну, john-doe-1 также будет новее, чем john-doe-2. Но чтобы ответить на ваш вопрос, я считаю, что это сработает: https://gist.github.com/456d87a12bdd6aa30779. Однако я его не тестировал. – henrikhodne

+0

Спасибо, посмотрим! – David