2015-12-19 69 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,所以沒有任何其他可行的slu candidates隊候選人(timedate在這種情況下對slu candidates候選人沒有意義)。

我怎樣才能改變這種(當前格式):

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(比賽條件)所取代很好的理由。
我通常使用附加的段塞的候選與ID,由該分貝保持uniq的和比UUID短得多:

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

ID不適用於我,因爲在設置候選人之前未創建對象(是否有解決方法?)。我希望避免公開透露ID,但如果這是最好的解決方案,那麼它會使用UUID。 – Onichan

+0

我與'globalize'一起使用它可能這就是爲什麼我有ID。解決方法:after_create:清除slu and並再次保存(唉)? –

0

我知道你說

(時間或日期止跌」在這種情況下適用於slu candidates候選人)

但是,在假設你我們只是指的是時間的字符串格式,問題/顧慮:

  1. 你的模型只有name屬性
  2. 你不能使用id來追加到鼻涕蟲,因爲它沒有被創建
  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 < - 這是百萬分之一秒。這是不是將在同一時間創建,因此不會遇到slu conflicts衝突。如果有人認爲它可以再增加幾個零到該乘數。

+1

有沒有更好的方法,而不是有這麼長的slu??它沒有比使用散列更好,並且還顯示創建的時間(這可能不是您想要向最終用戶顯示的內容)。 – Onichan

0

舊行爲在特殊module中實施。但目前尚未公佈。因此,如果您想恢復舊的行爲,您可以在Github上的Gemfile中切換friebdly_id,並將sequentially_slugged添加到模塊列表中。