在我的应用程序中,我有一个Case
模型&用户生成的每个案例都有一个case_number
模型。case_number
是从我的Case
模型生成的。在创建case
后,当前IM正在从我的模型中创建一个3位随机数。
class Case < ActiveRecord::Base
after_create :random_case_number
private
def random_case_number
random_number = Random.rand(999)
self.update_attributes(case_number: random_number)
end
end
这导致了一些病例有相同的
case_number
我如何从我的模型中生成一个当前未使用的随机数&如果所有3位数字都被取下,它可以移动到4位,依此类推。 最佳答案
为了生成一个随机数,并确保数据库中不存在数字,我会这样做:
before_create :assign_unique_case_number
validates! :case_number, uniqueness: true
private
CASE_NUMBER_RANGE = (10_000..99_999)
def assign_unique_case_number
self.case_number = loop do
number = rand(CASE_NUMBER_RANGE)
break number unless Case.exists?(case_number: number)
end
end
请注意,数据库中的案例越多,查找未使用的号码可能需要的时间越长。因此,我建议从一开始就使用更大的数字。更大的数字还有另一个优势:它们更难猜测应用程序中哪些可能重要,哪些可能不重要。
此外:rails不能保证数据库中的唯一性。可能会有导致重复的种族状况。避免这种情况的唯一方法是在迁移过程中向数据库列添加唯一索引,如下所示:
add_index :cases, :case_number, unique: true