在我的Rails應用程序我生成這個方法令牌我User
模型內部:如何確保在Ruby on Rails中更新記錄時列的唯一性?
def generate_token(column)
update_column(column, SecureRandom.urlsafe_base64)
end
我知道這是極不可能不會發生,但我怎麼能保證沒有兩個令牌曾經用相同的價值創造?
在我的Rails應用程序我生成這個方法令牌我User
模型內部:如何確保在Ruby on Rails中更新記錄時列的唯一性?
def generate_token(column)
update_column(column, SecureRandom.urlsafe_base64)
end
我知道這是極不可能不會發生,但我怎麼能保證沒有兩個令牌曾經用相同的價值創造?
我想你是說你想確保令牌是唯一的嗎?
添加一個實例方法來做到這一點:
def generate_token
begin
self.token = SecureRandom.urlsafe_base64
end while User.exists?(token: token)
end
爲了完整起見,和其他人指出,這不會絕對保證唯一性。唯一可靠的方式是在數據庫級別添加一個唯一約束:
add_index :people, :token, unique: true
好的,謝謝!但是這實際上並不能*保存*令牌,對吧? – Tintin81
這裏不需要self.token,使用標記:標記就足夠了...... –
不要忘記在'user'表上的'token'上添加一個索引。 – Reactormonk
我想補充一個數據庫約束也可以肯定的:
add_index :people, :token, :unique => true
另請參閱:https://gist.github.com/stevecj/5112001。 –
任何特殊原因使用'update_column'而不是' update_attribute'? –
不,不是。 Rails 4中不是首選嗎?我想我讀了一些東西......但如果我錯了,請糾正我。 – Tintin81
我認爲他們都是有原因的。其中一個跳過驗證,所以你不能使用'validates_uniqueness_of' ...取決於你對'generate_token'的使用 –