2009-11-29 160 views
9

我有一個要求,能夠通過唯一的鍵來標識表中的記錄(在本例中爲用戶表),該唯一鍵不會泄露表中記錄的排序。生成用於標識記錄的唯一隨機字符串

目前,我有主鍵字段和所生成的路線是這樣的:

/users/1 

不過,我希望能夠產生類似的路線:

/users/kfjslncdk 

我可以在線路端,數據庫端等一切線上,但我不知道生成一個唯一的字符串標識符的最佳方式是在軌道上。我想這樣做:

before_save :create_unique_identifier 

def create_unique_identifier 
    self.unique_identifier = ... magic goes here ... 
end 

我想我可以用用UUIDTools創建一個GUID的第一部分,但我需要檢查,以確保它是保存用戶之前唯一的。

任何意見將不勝感激!

回答

38
before_create :create_unique_identifier 

def create_unique_identifier 
    loop do 
    self. unique_identifier = SecureRandom.hex(5) # or whatever you chose like UUID tools 
    break unless self.class.exists?(:unique_identifier => unique_identifier) 
    end 
end 
3

保存自己從存儲混淆ID的麻煩,簡單地編碼該ID與基地62(a-z,A-Z,0-9),但自定義「數字」的順序。這將使得弄清訂單變得非常複雜。

我曾經寫過的東西的類,它是(可能需要一些重構):https://gist.github.com/4058176