Как определить "уникальное" ограничение для столбца таблицы MySQL в Ruby on Rails 3?

У меня есть простая таблица MySQL с одним столбцом: name.

Я хотел бы определить уникальное ограничение для этого столбца.

Я могу сделать:

class MyModel < ActiveRecord::Base
  validates_uniqueness_of :my_column_name
end

но он будет работать только на уровне приложения, а не на уровне базы данных.

Что бы вы предложили?

Ответы

Ответ 1

Это не очень полезно, но похоже, что нет большого ответа для обеспечения уникальности на уровне базы данных. Из Руководство по миграции Rails:

Способ Active Record утверждает, что интеллект принадлежит вашим моделям, а не в базе данных. Таким образом, такие функции, как триггеры или ограничения внешнего ключа, которые вставляют часть этого интеллекта обратно в базу данных, не используются в значительной степени.

Валидации, такие как validates_uniqueness_of, являются одним из способов, в которых модели могут обеспечить целостность данных.

Хотя Active Record не предоставляет никаких инструментов для непосредственного взаимодействия с такими функциями, метод execute может использоваться для выполнения произвольного SQL.

Похоже, что запуск самой команды SQL с помощью метода выполнения ActiveRecord может быть лучшим способом, если вы действительно хотите обеспечить уникальность в базе данных.

Ответ 2

Добавьте уникальное ограничение для самой базы данных, используя:

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