Skip to content

Commit 2f863ec

Browse files
committed
fix: add unique index on subscriptions to prevent duplicate entries
1 parent 75ecc09 commit 2f863ec

2 files changed

Lines changed: 26 additions & 1 deletion

File tree

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
class FixDuplicateSubscriptionsAndAddUniqueIndex < ActiveRecord::Migration[8.1]
2+
def up
3+
execute <<~SQL
4+
DELETE FROM subscriptions
5+
WHERE id NOT IN (
6+
SELECT MIN(id)
7+
FROM subscriptions
8+
GROUP BY member_id, group_id
9+
)
10+
AND (member_id, group_id) IN (
11+
SELECT member_id, group_id
12+
FROM subscriptions
13+
GROUP BY member_id, group_id
14+
HAVING COUNT(*) > 1
15+
)
16+
SQL
17+
18+
add_index :subscriptions, %i[member_id group_id], unique: true, name: 'index_subscriptions_on_member_id_group_id'
19+
end
20+
21+
def down
22+
remove_index :subscriptions, name: 'index_subscriptions_on_member_id_group_id'
23+
end
24+
end

db/schema.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema[8.1].define(version: 2026_03_30_193245) do
13+
ActiveRecord::Schema[8.1].define(version: 2026_04_08_220120) do
1414
# These are extensions that must be enabled in order to support this database
1515
enable_extension "pg_catalog.plpgsql"
1616

@@ -525,6 +525,7 @@
525525
t.integer "member_id"
526526
t.datetime "updated_at", precision: nil
527527
t.index ["group_id"], name: "index_subscriptions_on_group_id"
528+
t.index ["member_id", "group_id"], name: "index_subscriptions_on_member_id_group_id", unique: true
528529
t.index ["member_id"], name: "index_subscriptions_on_member_id"
529530
end
530531

0 commit comments

Comments
 (0)