我有一个简单的MySQL表,其中包含一列:name
。
我想在此列上定义一个唯一约束。
我能做到:
class MyModel < ActiveRecord::Base
validates_uniqueness_of :my_column_name
end
但它只能在应用程序级别工作,而不能在数据库级别工作。
你会建议什么?
答案 0 :(得分:33)
使用以下方法向数据库本身添加唯一约束:
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
答案 1 :(得分:5)
这不是非常有用,但看起来在数据库级别强制执行唯一性似乎没有很好的答案。来自Rails migration guide:
Active Record方式声称智能属于您的模型,而不属于数据库。因此,诸如触发器或外键约束之类的功能(将一些智能推回到数据库中)并没有被大量使用。
validates_uniqueness_of等验证是模型可以强制执行数据完整性的一种方式。
虽然Active Record不提供任何直接使用此类功能的工具,但执行方法可用于执行任意SQL。
如果您真的想要在数据库中强制执行唯一性,那么使用ActiveRecord execute方法自行运行SQL命令可能是最好的方法。