2024-12-26 19:30:32 +00:00
|
|
|
# Copyright (C) 2024 Manuel Bustillo
|
|
|
|
|
2024-12-17 00:46:01 +01:00
|
|
|
class CreateGroupAffinities < ActiveRecord::Migration[8.0]
|
|
|
|
disable_ddl_transaction!
|
|
|
|
|
|
|
|
def change
|
|
|
|
create_table :group_affinities, if_not_exists: true do |t|
|
|
|
|
t.references :group_a, type: :uuid, null: false, foreign_key: { to_table: :groups }
|
|
|
|
t.references :group_b, type: :uuid, null: false, foreign_key: { to_table: :groups }
|
|
|
|
t.float :discomfort, null: false
|
|
|
|
t.timestamps
|
|
|
|
end
|
|
|
|
|
|
|
|
add_check_constraint :group_affinities, 'group_a_id != group_b_id', name: :check_distinct_groups, if_not_exists: true
|
|
|
|
add_check_constraint :group_affinities, 'discomfort >= 0 AND discomfort <= 2', if_not_exists: true
|
|
|
|
|
|
|
|
reversible do |dir|
|
|
|
|
dir.up do
|
|
|
|
execute <<~SQL
|
|
|
|
CREATE UNIQUE INDEX CONCURRENTLY uindex_group_pair ON group_affinities (least(group_a_id, group_b_id), greatest(group_a_id, group_b_id));
|
|
|
|
SQL
|
|
|
|
end
|
|
|
|
|
|
|
|
dir.down do
|
|
|
|
remove_index :group_affinities, name: :uindex_group_pair, if_exists: true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|