2

在我的 Rails 4 应用程序中,我想覆盖 Active Record 以创建具有 7 位随机数的 id 的记录。例如 4526378 而不是 1。我找到了一种方法来做到这一点,但我不确定它是正确的方法。在我的模型中,我有:

class App < ActiveRecord::Base
  after_initialize :add_id

  def add_id
    self.id ||= SecureRandom.random_number(9999999) if self.new_record?
  end
end

这是一种可接受的方式吗?是否会发生任何冲突,如果会发生什么,它是否会再次尝试使用新的 SecureRandom 创建记录。还有什么方法可以在我的 config/initializers 中设置和 initializer.rb 文件自动为每个模型执行此操作?谢谢

好的,所以我在我的 config/initializers 目录中添加了一个名为 active_record.rb 的初始化程序。里面的代码如下:

class ActiveRecord::Base
    before_create :set_id

    def set_id
        self.id = SecureRandom.random_number(9999999)
    end
end

上面的这段代码实际上工作得很好,但现在发生了冲突。在此代码中,我可以执行检查以确保其唯一性吗?如果不是,则生成一个新的。我也会将其更改为SecureRandom.hex以允许字母减少碰撞的机会。

4

1 回答 1

5

我可能会id独自离开,并添加另一个字段来保存随机 ID。然后,在创建之前,生成新的随机 ID,直到找到唯一的。

class ActiveRecord::Base
  validates :random_id, uniqueness: true

  before_create :set_random_id

  def set_random_id
    loop do
      self.random_id = SecureRandom.random_number(9999999)
      break unless find_by_random_id(self.random_id)
    end
  end

end

请注意,您拥有的记录越多,找到未使用的随机 ID 所需的时间就越长。这就是为什么您可能应该使用比 9999999 更大的随机数,例如几乎不可能发生冲突的UUID 。

于 2013-05-24T17:14:52.153 回答