2012-02-25 44 views
1

對於即將推出的項目,我們需要具有唯一的真實世界標識符,這些標識符向用戶公開諸如帳號或案例號(如錯誤跟蹤ID)的內容。這些將始終是系統生成的並且不可更改。現在我們打算嚴格按照Heroku運行。雖然(正如我的名字所暗示的那樣),但我對Ruby on Rails的精彩性卻很陌生,在企業應用程序開發方面我有很長的背景。我試圖在「RoR方式」中完成我之前完成的任務關於在Ruby on Rails中實現代理鍵的問題

很明顯,RoR有很棒的主鍵支持。我在這裏閱讀了數十篇帖子,建議將業務需求改爲使用開箱即用的方法。

因此,讓我描述一下我正在努力完成的任務,並請讓我知道您是否面臨類似的目標以及採取了哪些方法。

1)想要有一個長度一致的人類可讀密鑰。總是有一個帳號ID或交易ID長度相同的值(用於表單驗證,培訓銷售人員等)。使用Ruby的先天密鑰生成,只需添加緩衝區字符(例如100000而不是1)即可。 2)緊湊性:我最初的計劃是使用基本的36個唯一鍵(例如36個值[0..9],[a..z])。作爲我們API /接口的一部分,我們計劃基於短格式URL(例如xx.co/000001)公開某些非保密對象。我喜歡能夠在基數爲36的情況下擁有五個字符的標識符,而在十進制數字中則爲7+。

所以我可以想到兩種可能的方法: a)添加我自己的字段並開發自己的唯一密鑰生成器(或者也許有人會指給我一個)。

b)填充前導數字(我假設我可以強制唯一密鑰生成從1xxxxxxx開始,而不是0000001)。然後使用to_s(36)方法將其轉換爲基數36,以便與人類進行所有交互。甚至可能以base 36格式存儲數據庫中的實際ID值以避免正在進行的轉換,但始終在查詢之前執行轉換以避免需要另一個索引。

我傾向於方法B,因爲從數據庫性能的角度來看,它似乎是最優的,並且它將需要最少的投入用於非增值開銷。再次,任何真實世界的經驗與這些主題和想法的最佳方法將不勝感激。

在此先感謝!

回答

2

我永遠不會在任何業務重要性的Rails表中使用主鍵。有一天,業務端的人會想改變它,最終會成爲一個巨大的痛苦,並會使你和你的用戶認爲是規範的一堆URL失效,並且會把你所有的外鍵和等等等等等等。這只是一個非常糟糕的主意,我鼓勵你不要這樣做。

Rails做到這一點的方法是有一個新的列,稱爲像數字或bug_tracking_number或什麼罷工你的幻想,並before_validation實現一個回調,給它一個值。這是你可以讓你的創意閃耀的地方;這樣的事情聽起來像你想要什麼:

before_validation(:on => :create) do 
    self.number = CaseNumber.count + 1 
end 

你可以墊在號碼中,保證其唯一性,或做任何你想要的東西。

+0

感謝@Veraticus,非常感謝。我可能會按照你的建議去做,開始我的CaseNumber計數在10000000,以保持數字一致,並實際存儲在案例記錄中作爲基準36,以縮短人機交互。再次感謝! – SFRubyNewby 2012-02-29 15:22:18