如何在Ruby on Rails中更新记录时确保列的唯一性?

时间:2013-08-16 23:09:09

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2

在我的Rails应用程序中,我使用此方法在User模型中生成标记:

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

我知道这种情况极不可能发生,但我怎样才能确保不会创建具有相同值的两个令牌?

2 个答案:

答案 0 :(得分:3)

我认为你的意思是你想确保令牌是唯一的吗?

添加实例方法来执行此操作:

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

为了完整起见,正如其他人所指出的那样,这不会绝对保证唯一性。唯一可靠的方法是在数据库级别添加唯一约束:

add_index :people, :token, unique: true

答案 1 :(得分:1)

我还要添加一个数据库约束来确定:

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