使用开始范围在Rails中混淆id

时间:2017-07-23 05:01:55

标签: ruby-on-rails ruby database

我试图在几个模型中混淆id。

我使用this GitHub issue中提出的解决方案完成此操作并且工作正常(由于未来的兼容性问题,我不想使用gem。)

问题在于生成的ID很小。我希望他们从1000000开始。如何以正确的方式实现这一目标?

模型的代码:

 before_create :generate_random_id

 private 

 def generate_random_id
   self.id = SecureRandom.uuid
 end 

2 个答案:

答案 0 :(得分:1)

id很小的原因是因为UUID字符串被转换为整数。请改用SecureRandom.random_number(100000000000)

您需要检查数字是否大于1000000且尚未在系统中。

before_create :generate_random_id

private 

def generate_random_id
  while self.id.nil? || Model.find_by_id(self.id) do
    self.id = SecureRandom.random_number(100000000000) + 1000000
  end
end 

OR

使用uuid作为本机ID。 Postgresql本身很好地支持这个扩展名:

CREATE EXTENSION pgcrypto;  
CREATE TABLE mymodel(  
   id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
   ...
);

答案 1 :(得分:0)

  

我希望他们从1000000开始。如何以正确的方式实现这一目标?

所以只需转移起点。

def generate_random_id
  self.id = 1_000_000 + rand(1_000_000_000)
  # then, of course, make sure that you don't have a collision
  # (an existing record with this random id)
end