如何在Ruby on Rails 3中的MySQL表列上定义“唯一”约束?

我有一个简单的MySQL表,其中包含一列: name

我想在此列上定义一个唯一约束。

我可以:

 class MyModel < ActiveRecord::Base validates_uniqueness_of :my_column_name end 

但它只能在应用程序级别工作,而不能在数据库级别工作。

你会建议什么?

这不是非常有用,但看起来在数据库级别强制执行唯一性似乎没有很好的答案。 从Rails迁移指南 :

Active Record方式声称智能属于您的模型,而不是数据库。 因此,诸如触发器或外键约束之类的function(其将一些智能推回到数据库中)没有被大量使用。

诸如validates_uniqueness_of之类的validation是模型可以强制执行数据完整性的一种方式。

尽管Active Record不提供任何直接使用此类function的工具, 但execute方法可用于执行任意SQL。

如果你真的想在数据库中强制执行唯一性,看起来自己使用ActiveRecord执行方法自己运行SQL命令可能是最好的方法。

使用以下方法向数据库本身添加唯一约束:

 add_index :my_models, :my_column_name, unique: true 

…通过迁移(您可能希望my_column_name也不接受任何空值:

 class CreateMyModels < ActiveRecord::Migration def change create_table :my_models do |t| t.string :my_column_name, null: false t.timestamps end add_index :my_models, :my_column_name, unique: true end end