如何在Rails活动记录中创建唯一的列,而不是id

问题描述 投票:3回答:2
class CreateUsers < ActiveRecord::Migration
   def up
     create_table :users do |t|
        t.string "email", :unique=>true

我正在尝试添加此唯一选项,以使该电子邮件ID在Rails模型中唯一,但是它不起作用,如何使该电子邮件ID唯一?

ruby-on-rails database activerecord model unique-constraint
2个回答
15
投票

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


9
投票

更新:现在,我建议您不要忽略数据库级别的索引,您可以检查answer below以了解如何添加数据库唯一索引。

之所以这样做不是一个好主意,是因为存在竞争状况的可能性,当应用程序的多个线程/进程几乎在同一时间收到请求插入相同数据的请求时,两个线程都会检查是否电子邮件是否已经存在于数据库中,并且两者都将发现该时刻不存在该电子邮件,因此两者都将通过#validate检查,然后都将继续插入。然后,您最终将在数据库中拥有相同的电子邮件,却不知道是怎么回事。

进行验证很有用,因为您可以对控制器中的无效记录错误做出反应。

原始答案:为什么在数据库级别设置限制,我认为在模型级别设置验证绰绰有余,至少在每当需要更改或删除限制时,您并不需要添加新的迁移

class User < ActiveRecord::Base
  validates :email, uniqueness: true
end
© www.soinside.com 2019 - 2024. All rights reserved.