在我的应用程序中,我有一个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

10-08 08:18
查看更多