class CreateUsers < ActiveRecord::Migration
def up
create_table :users do |t|
t.string "email", :unique=>true
我正在尝试添加此唯一选项,以使该电子邮件ID在Rails模型中唯一,但是它不起作用,如何使该电子邮件ID唯一?
unique
选项应该传递给add_index
调用,而不是在您定义列的位置。
如下更新您的迁移定义:
class CreateUsers < ActiveRecord::Migration
def up
create_table :users do |t|
t.string "email"
end
add_index :users, :email, unique: true
end
...
end
并且如果您不想允许null,则使用t.string :email, null: false
。
更新:现在,我建议您不要忽略数据库级别的索引,您可以检查answer below以了解如何添加数据库唯一索引。
之所以这样做不是一个好主意,是因为存在竞争状况的可能性,当应用程序的多个线程/进程几乎在同一时间收到请求插入相同数据的请求时,两个线程都会检查是否电子邮件是否已经存在于数据库中,并且两者都将发现该时刻不存在该电子邮件,因此两者都将通过#validate
检查,然后都将继续插入。然后,您最终将在数据库中拥有相同的电子邮件,却不知道是怎么回事。
进行验证很有用,因为您可以对控制器中的无效记录错误做出反应。
原始答案:为什么在数据库级别设置限制,我认为在模型级别设置验证绰绰有余,至少在每当需要更改或删除限制时,您并不需要添加新的迁移
class User < ActiveRecord::Base
validates :email, uniqueness: true
end