Как определить «уникальное» ограничение для столбца таблицы MySQL в Ruby on Rails 3? - PullRequest
14 голосов
/ 10 декабря 2010

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

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

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

class MyModel < ActiveRecord::Base
  validates_uniqueness_of :my_column_name
end

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

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

Ответы [ 2 ]

33 голосов
/ 02 июля 2012

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

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
5 голосов
/ 10 декабря 2010

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

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

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

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

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

...