我试图在几个模型中混淆id。
我使用this GitHub issue中提出的解决方案完成此操作并且工作正常(由于未来的兼容性问题,我不想使用gem
。)
问题在于生成的ID很小。我希望他们从1000000开始。如何以正确的方式实现这一目标?
模型的代码:
before_create :generate_random_id
private
def generate_random_id
self.id = SecureRandom.uuid
end
答案 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