У меня есть две таблицы: активы и отношения. Они выглядят так (плюс другие столбцы, которые я опускаю для краткости):
# Table name: relationships
#
# id :uuid not null, primary key
# asset1_id :uuid not null
# asset2_id :uuid not null
# type :string not null
# Table name: assets
#
# id :uuid not null, primary key
# type :string not null
# name :string not null
Я хочу, чтобы отношения типа между двумя активами были уникальными. Например, предположим, у меня есть отношение типа membership
.
Relationship.create!(type: 'membership', asset1_id: '61d58a49-86a9-4d7f-b069-2ed1fa27b387', asset2_id: '1856df48-3193-45de-bef0-122cd9f58d7b')
. Если я попытаюсь создать эту запись снова, я могу легко предотвратить ее с помощью validates :type, uniqueness: { scope: [:asset1_id, :asset2_id] }
и add_index :relationships, [:type, :asset1_id, :asset2_id], unique: true
, однако когда Я использую их в следующем случае не предотвращено :
Relationship.create!(type: 'membership', asset1_id: '1856df48-3193-45de-bef0-122cd9f58d7b', asset2_id: '61d58a49-86a9-4d7f-b069-2ed1fa27b387')
Обратите внимание, что это то же самое, что и предыдущая запись, только с обратным порядком идентификаторов активов.
Как я могу предотвратить это (желательно на уровне БД)?