2015-12-19 7 views
-1

я заметил на docs он говорит: Previous versions of FriendlyId appended a numeric sequence to make slugs unique, but this was removed to simplify using FriendlyId in concurrent code.Использование числовых последовательностей для Дублированный Слизни [ID] Дружественные

Есть ли способ, чтобы вернуться к этому формату? Моя модель имеет только name, поэтому нет никаких других жизнеспособных кандидатов в пули, и (time или date не имеет смысла в этом случае для кандидатов в пули).

Как я могу изменить (текущий формат):

car.friendly_id #=> "peugeot-206" 
car2.friendly_id #=> "peugeot-206-f9f3789a-daec-4156-af1d-fab81aa16ee5" 
car3.friendly_id #=> "peugeot-206-f9dsafad-eamj-2091-a3de-fabsafafdsa5" 

В это:

car.friendly_id #=> "peugeot-206" 
car2.friendly_id #=> "peugeot-206-1" 
car3.friendly_id #=> "peugeot-206-2" 

ответ

-1

Есть веские причины, что "серийный номер" был заменен на UUID (условия гонки).
Я обычно использую дополнительный кандидат пробкового с идентификатором, который поддерживается Uniq в дБ и гораздо короче, чем UUID:

[ [:name], [:name, :id] ] 
+0

ID не работает для меня, потому что объект не создан до установки кандидата (есть ли обходной путь?). И я надеялся избежать публичного раскрытия идентификатора, но если это лучшее решение, он использует UUID. – Onichan

+0

Я использую его вместе с 'globalize', возможно, поэтому у меня есть идентификаторы. Обходной путь: after_create: очистить слизень и снова сохранить (тьфу)? –

0

Я понимаю, что вы сказали

(дата или время Wouldn» т имеет смысл, в этом случае для кандидатов улиток)

Но предполагается, что вы, мы только со ссылкой на формат строки времени и не UNIX, которая является числовой последовательности, то я придумал этот обходной путь к вашей проблемы/проблемы:

  1. ваша модель имеет только имя атрибута
  2. вы не можете использовать идентификатор для добавления к слизняка, поскольку она не была создана еще
  3. вы хотите слизней быть UniQ и приращением
  4. вы не хотите использовать UUID

# app/models/car.rb 
class Car < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, use: :slugged 

    def normalize_friendly_id(string) 
    incremented_number = (Time.now.to_f * 1000000).to_i 
    "#{super}-#{incremented_number}" 
    end 
end 

Так что теперь это работает

car1 = Car.create(name: "peugeot") 
car2 = Car.create(name: "peugeot") 
car3 = Car.create(name: "peugeot") 

car1.friendly_id #=> "peugeot-1451368076324115" 
car2.friendly_id #=> "peugeot-1451368076457560" 
car3.friendly_id #=> "peugeot-1451368076460087" 

Примечание: числа являются увеличивающиеся

Time.now.to_f * 1000 будет миллисекунды, и я использую Time.now.to_f * 1000000, который MICROSECONDS < - это одна миллионная часть секунды. Это NOT будет создаваться в одно и то же время и, следовательно, не столкнется с конфликтами слизней. И если кто-то там подумает, что он мог бы добавить еще несколько нулей в этот множитель.

+1

Есть ли лучший способ вместо такой длинной пули? Это не намного лучше, чем использование хэша, а также показывает созданное время (что может быть не то, что вы хотите показать конечному пользователю). – Onichan

0

Старое поведение было реализовано в специальном module. Но на данный момент он еще не выпущен.Итак, если вы хотите восстановить старое поведение, вы можете переключить friebdly_id в свой Gemfile на Github и добавить sequentially_slugged в список модулей.

 Смежные вопросы

  • Нет связанных вопросов^_^