【发布时间】:2020-02-24 15:21:10
【问题描述】:
我有两个表,资产和关系。它们看起来像这样(加上我为简洁起见省略的其他列):
# 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')
注意这里和之前的记录是一样的,只是资产id的顺序颠倒了。
如何防止这种情况(最好在数据库级别)?
【问题讨论】:
标签: ruby-on-rails ruby postgresql unique-constraint