3
class CreateUsers < ActiveRecord::Migration 
    def up 
    create_table :users do |t| 
     t.string "email", :unique=>true 

我尝试添加使这次电子邮件ID在轨模式独特,但其没有工作,所以我怎么能做出这样的电子邮件ID独特的这个独特的选项?如何在轨活动记录比ID之外的唯一列

+0

是什么让你觉得它是'不工作'? –

回答

13

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 

如果你不希望允许空值,则使用t.string :email, null: false

+0

太棒了! Post with full explanation:https://robots.thoughtbot.com/the-perils-of-uniqueness-validations – wizbcn

3

为什么要限制db级别,我认为在模型级别进行验证是绰绰有余的,至少在需要更改或移除限制时,您不会发现自己需要添加新的迁移

class User < ActiveRecord::Base 
    validates :email, uniqueness: true 
end 
+2

由于数据的完整性! –

+1

@PauloFidalgo我明白,但是当你有一张拥有数百万条记录的表,并且你想更新你的索引时,你最终可能会锁定你的表几个小时,这就是为什么我认为使用代码级检查更实用。 –

+0

另外,不是每个数据库都限于通过Rails访问,所以约束是最安全的放入数据库级别,这样任何可能写入数据库的应用程序都将遵循相同的规则集。在Rails中使用验证主要是(a)在Rails应用程序本身中获取有用的错误消息,以及(b)使用'valid?'方法,这可能非常有用,并且可能(c)支持其他应用程序特定的业务逻辑。 – jefflunt