Мне нужна миграция, чтобы применить уникальное ограничение к комбинации столбцов.
то есть.
для таблицы Person комбинация Firstname, LastName и Dob должна быть уникальной.
Мне нужна миграция, чтобы применить уникальное ограничение к комбинации столбцов.
то есть.
для таблицы Person комбинация Firstname, LastName и Dob должна быть уникальной.
add_index :people, [:firstname, :lastname, :dob], :unique => true
Согласно howmanyofme.com, "Есть только 46 427 человек по имени Джон Смит" только в Соединенных Штатах. Это около 127 лет. Поскольку это значительно превышает среднюю продолжительность жизни человека, это означает, что конфликт DOB математически определен.
Все, что я говорю, это то, что конкретная комбинация уникальных полей может в будущем привести к крайнему разочарованию пользователя/клиента.
Рассмотрим нечто действительно уникальное, например, национальный идентификационный номер.
(Я понимаю, что я очень опаздываю на вечеринку с этим, но это может помочь будущим читателям.)
Вы можете добавить ограничение без индекса. Это будет зависеть от того, какую базу данных вы используете. Ниже приведен пример кода миграции для 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
Существуют различные ограничения, которые вы можете добавить. Прочитайте документы
Привет. Вы можете добавить уникальный индекс в свою миграцию в столбцы, например
add_index(:accounts, [:branch_id, :party_id], :unique => true)
или отдельные уникальные индексы для каждого столбца
В типичном примере таблицы соединений между пользователями и сообщениями:
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