Ruby on Rails - 唯一性

时间:2012-09-14 14:50:23

标签: ruby-on-rails

我有一个关于唯一性验证的问题。

来自:http://guides.rubyonrails.org/active_record_validations_callbacks.html#uniqueness

“它不会在数据库中创建唯一性约束,因此可能会发生这样的情况,即两个不同的数据库连接会为您想要唯一的列创建两个具有相同值的记录。为避免这种情况,您必须创建一个唯一的数据库中的索引。“

这是否意味着每当我验证唯一性时,我必须在数据库中添加索引?或者只有在可能同时插入两个背诵时才需要它?

这里的最佳做法是什么:独特和索引始终在一起或取决于具体情况?

1 个答案:

答案 0 :(得分:3)

这实际上是一种竞争条件。在那里Alice用电子邮件地址alice@gmail.com注册并点击提交按钮两次。因为她如此迅速地击中了它们,所以她只在记忆中有它们,并且它们通过了验证。然后两者都写入数据库。解决方案是要求数据库检查它们存储在内存中或写入数据库之间的唯一性。

您需要做的是在迁移中添加这样的一行:

add_index :table_name, :column_name, unique: true

就最佳实践而言,当你有两个同样会导致问题时,你肯定想要这样做。如果提交的两条推文具有相同的内容,那可能不是什么大不了的事,但如果你有两个使用相同电子邮件地址的用户,则会出现问题。