gpt4 book ai didi

ruby-on-rails - 覆盖 ActiveRecord ID

转载 作者:数据小太阳 更新时间:2023-10-29 08:32:39 24 4
gpt4 key购买 nike

在我的 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 创建记录。还有什么方法可以在我的配置/初始化程序中设置和初始化程序.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 以允许字母,从而减少发生碰撞的机会。

最佳答案

我可能会单独保留 id,并添加另一个字段来保存随机 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。几乎不可能发生碰撞。

关于ruby-on-rails - 覆盖 ActiveRecord ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16739839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com