2017-07-23 61 views
0

我想混淆在幾個模型中的ID。在開始範圍內的Rails混淆id

我使用this GitHub issue中提出的解決方案來完成此工作,並且工作正常(由於未來的兼容性問題,我不想使用gem)。

問題是生成的ID很小。我希望他們從1000000開始。如何以正確的方式完成這項工作?

用於模型的代碼:

before_create :generate_random_id 

private 

def generate_random_id 
    self.id = SecureRandom.uuid 
end 
+0

這裏是有很多不同的方法來生成具有不同長度的不同ID的兩個資源:http://api.rubyonrails.org/v3.0.9/classes/ActiveSupport/SecureRandom.html和https:// ruby-doc.org/stdlib-1.9.3/libdoc/securerandom/rdoc/SecureRandom.html – stuyam

回答

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(), 
    ... 
); 
+0

這是創建新記錄的大量工作。也容易出現競爭狀況。直接使用uuids會更好。 –

+0

但是如果一個人使用整數(無論出於何種原因),那麼就必須這樣做,是的。 –

+0

@SergioTulentsev Postgresql本身很好地支持 - http://www.starkandwayne.com/blog/uuid-primary-keys-in-postgresql/ – PressingOnAlways

0

我希望他們能夠重新開始的100萬以正確的方式如何才能做到這一點?

所以只是轉變的起點。

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