如何在除了id之外的rails活动记录中创建一个唯一列

asa*_*mat 3 database activerecord model ruby-on-rails unique-constraint

class CreateUsers < ActiveRecord::Migration
   def up
     create_table :users do |t|
        t.string "email", :unique=>true
Run Code Online (Sandbox Code Playgroud)

我试图添加这个独特的选项,使这个电子邮件ID在rails模型中独一无二,但它没有工作,所以我如何才能使这个电子邮件ID独一无二?

vee*_*vee 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
Run Code Online (Sandbox Code Playgroud)

如果你不想允许null然后使用t.string :email, null: false.


Moh*_*ady 7

为什么要在数据库级别设置限制,我认为在模型级别设置验证绰绰有余,至少在每当您需要更改或删除限制时,您都不会发现自己需要添加新的迁移

class User < ActiveRecord::Base
  validates :email, uniqueness: true
end
Run Code Online (Sandbox Code Playgroud)

  • 因为数据的完整性! (6认同)
  • 同样,并非每个数据库都限于通过Rails进行访问,因此在数据库级别放置约束最安全,因此,可能写入数据库的任何应用程序都将遵循相同的规则集。在Rails中使用验证主要是为了(a)在Rails应用程序本身中获得有用的错误消息,以及(b)启用“ valid?”方法的使用,该方法可能非常有用,并且可能(c)支持其他特定于应用的业务逻辑。 (4认同)