ny9*_*y95 2 ruby activerecord ruby-on-rails
在我的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
Run Code Online (Sandbox Code Playgroud)
这是一种可以接受的方式吗?是否会发生任何冲突,若然后会发生什么,它会再次尝试使用新的SecureRandom创建记录.还有什么方法我可以在我的配置/初始化器中设置和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
Run Code Online (Sandbox Code Playgroud)
上面的代码实际上工作得很好,但现在碰撞是个问题.在这段代码中,我可以执行检查以确保其独特性吗?如果它不生成一个新的.我也会改变它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
Run Code Online (Sandbox Code Playgroud)
请注意,您拥有的记录越多,查找未拍摄的随机ID所需的时间就越长.这就是为什么你应该使用比9999999更大的随机数,就像UUID那样几乎不可能发生碰撞.
| 归档时间: |
|
| 查看次数: |
489 次 |
| 最近记录: |