Миграция для добавления уникального ограничения к комбинации столбцов - PullRequest
129 голосов
/ 30 июля 2010

Мне нужна миграция для применения уникального ограничения к комбинации столбцов.т.е. для таблицы people комбинация first_name, last_Name и Dob должна быть уникальной.

Ответы [ 5 ]

228 голосов
/ 30 июля 2010

add_index :people, [:firstname, :lastname, :dob], :unique => true

21 голосов
/ 09 сентября 2015

По данным howmanyofme.com, «только в Соединенных Штатах« 46 427 человек по имени Джон Смит ».Это около 127 лет дней.Поскольку это значительно превышает среднюю продолжительность жизни человека, это означает, что столкновение DOB математически точно.

Все, что я хочу сказать, это то, что эта конкретная комбинация уникальных полей может в будущем привести к сильному разочарованию пользователя / клиента.

Рассмотрим что-то действительно уникальное, например, национальный идентификационный номер, если это уместно..

(Я понимаю, что очень поздно на вечеринке с этим, но это может помочь будущим читателям.)

17 голосов
/ 24 февраля 2015

Возможно, вы захотите добавить ограничение без индекса. Это будет зависеть от того, какую базу данных вы используете. Ниже приведен пример кода миграции для Postgres. (tracking_number, carrier) - это список столбцов, которые вы хотите использовать для ограничения.

class AddUniqeConstraintToShipments < ActiveRecord::Migration
  def up
    execute <<-SQL
      alter table shipments
        add constraint shipment_tracking_number unique (tracking_number, carrier);
    SQL
  end

  def down
    execute <<-SQL
      alter table shipments
        drop constraint if exists shipment_tracking_number;
    SQL
  end
end

Существуют различные ограничения, которые вы можете добавить. Читать документы

7 голосов
/ 30 июля 2010

Привет Вы можете добавить уникальный индекс в вашей миграции к столбцам, например,

add_index(:accounts, [:branch_id, :party_id], :unique => true)

или отдельные уникальные индексы для каждого столбца

3 голосов
/ 24 мая 2017

В типичном примере таблицы соединений между пользователями и сообщениями:

create_table :users
create_table :posts

create_table :ownerships do |t|
  t.belongs_to :user, foreign_key: true, null: false
  t.belongs_to :post, foreign_key: true, null: false
end

add_index :ownerships, [:user_id, :post_id], unique: true

Попытка создать две одинаковые записи приведет к ошибке базы данных (в моем случае это Postgres):

ActiveRecord::RecordNotUnique: PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint "index_ownerships_on_user_id_and_post_id"
DETAIL:  Key (user_id, post_id)=(1, 1) already exists.
: INSERT INTO "ownerships" ("user_id", "post_id") VALUES ($1, $2) RETURNING "id"

например. делаем это:

Ownership.create!(user_id: user_id, post_id: post_id)
Ownership.create!(user_id: user_id, post_id: post_id)

Полностью работоспособный пример: https://gist.github.com/Dorian/9d641ca78dad8eb64736173614d97ced

db/schema.rb сгенерировано: https://gist.github.com/Dorian/a8449287fa62b88463f48da986c1744a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...