2013-08-16 45 views
1

在我的Rails應用程序我生成這個方法令牌我User模型內部:如何確保在Ruby on Rails中更新記錄時列的唯一性?

def generate_token(column) 
    update_column(column, SecureRandom.urlsafe_base64) 
end 

我知道這是極不可能不會發生,但我怎麼能保證沒有兩個令牌曾經用相同的價值創造?

+0

任何特殊原因使用'update_column'而不是' update_attribute'? –

+0

不,不是。 Rails 4中不是首選嗎?我想我讀了一些東西......但如果我錯了,請糾正我。 – Tintin81

+0

我認爲他們都是有原因的。其中一個跳過驗證,所以你不能使用'validates_uniqueness_of' ...取決於你對'generate_token'的使用 –

回答

3

我想你是說你想確保令牌是唯一的嗎?

添加一個實例方法來做到這一點:

def generate_token 
    begin 
    self.token = SecureRandom.urlsafe_base64 
    end while User.exists?(token: token) 
end 

爲了完整起見,和其他人指出,這不會絕對保證唯一性。唯一可靠的方式是在數據庫級別添加一個唯一約束:

add_index :people, :token, unique: true 
+0

好的,謝謝!但是這實際上並不能*保存*令牌,對吧? – Tintin81

+0

這裏不需要self.token,使用標記:標記就足夠了...... –

+1

不要忘記在'user'表上的'token'上添加一個索引。 – Reactormonk

1

我想補充一個數據庫約束也可以肯定的:

add_index :people, :token, :unique => true 
+0

另請參閱:https://gist.github.com/stevecj/5112001。 –

相關問題