14

我有一个带有一列的简单 MySQL 表:name.

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

我可以:

class MyModel < ActiveRecord::Base
  validates_uniqueness_of :my_column_name
end

但它只适用于应用程序级别,而不适用于数据库级别。

你有什么建议?

4

2 回答 2

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
于 2012-07-02T16:54:44.740 回答
5

这不是很有帮助,但看起来在数据库级别强制唯一性没有一个很好的答案。从Rails 迁移指南

Active Record 方式声称智能属于您的模型,而不是数据库。因此,诸如触发器或外键约束等将部分情报推回数据库的功能并未得到大量使用。

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

尽管 Active Record 没有提供任何工具来直接使用这些特性,但 execute 方法可以用来执行任意 SQL。

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

于 2010-12-10T04:02:10.537 回答