1
每次創建記錄時,如何生成唯一的順序ID(遵循模式)?我如何解決併發問題?生成唯一的順序ID
我希望此ID遵循固定模式。 例如:ABC00001,ABC00002,ABC00003等
我這樣做是爲了生成學生ID,並且我希望學院內的學生ID是連續的。將有多個研究所使用我的工具。
每次創建記錄時,如何生成唯一的順序ID(遵循模式)?我如何解決併發問題?生成唯一的順序ID
我希望此ID遵循固定模式。 例如:ABC00001,ABC00002,ABC00003等
我這樣做是爲了生成學生ID,並且我希望學院內的學生ID是連續的。將有多個研究所使用我的工具。
如果您使用活動記錄,則默認情況下已創建唯一的順序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)。
我實際上是這樣做來生成學生ID,我希望學院內的學生ID是連續的。將有多個研究所使用我的工具。如果我使用上述方法,則學院內的學生不能保證獲得順序ID。 – user1175969
@ user1175969如果你使用的是postgres,你可能很幸運(參見我的編輯)。如果沒有,你需要研究如何鎖定你使用的任何數據庫系統的表。序列寶石源代碼是尋找靈感的好地方。 – omnikron
我正在使用postgres。非常感謝! – user1175969