2016-12-20 247 views
1

每次創建記錄時,如何生成唯一的順序ID(遵循模式)?我如何解決併發問題?生成唯一的順序ID

我希望此ID遵循固定模式。 例如:ABC00001,ABC00002,ABC00003等

我這樣做是爲了生成學生ID,並且我希望學院內的學生ID是連續的。將有多個研究所使用我的工具。

回答

3

如果您使用活動記錄,則默認情況下已創建唯一的順序ID(id),併爲您處理所有併發問題。如果你需要使用它的查詢,然後一個單獨的列可能是前進的方向,但如果你只需要在一定的格式來顯示它您可以直接在你的模型像定義一個方法:

class MyModel 
    def my_unique_id 
    "ABC%.5d" % id 
    end 
end 

test = MyModel.create 
test.id #=> 1 
test.my_unique_id #=> "ABC00001" 

test2 = MyModel.create 
test2.id #=> 2 
test2.my_unique_id #=> "ABC00002" 

編輯

啊,你沒有提到你需要標識符在Institute內連續。你在使用PostgreSQL嗎?如果是這樣的sequenced gem可能是一個不錯的選擇 - 它增加了一個acts_as_sequence方法,它允許你這樣做:

class Student 
    acts_as_sequenced scope: :institute_id, column: :sequential_id 
    #... 
end 

如果你沒有使用PostgreSQL你需要找到併發鎖在處理的方式你數據庫系統的選擇,因爲寶石只能滿足postgres(見here)。

+0

我實際上是這樣做來生成學生ID,我希望學院內的學生ID是連續的。將有多個研究所使用我的工具。如果我使用上述方法,則學院內的學生不能保證獲得順序ID。 – user1175969

+1

@ user1175969如果你使用的是postgres,你可能很幸運(參見我的編輯)。如果沒有,你需要研究如何鎖定你使用的任何數據庫系統的表。序列寶石源代碼是尋找靈感的好地方。 – omnikron

+0

我正在使用postgres。非常感謝! – user1175969