FIX: drafts are unique by draft_key and user_id

Previously our index was non unique, causing situations where a user could
have multiple drafts stored in the table for the same exact entity.

This does not properly reflect reality and needed to change as in certain
cases duplicate drafts could be created causing internal data inconsistency
This commit is contained in:
Sam Saffron 2019-11-08 11:44:02 +11:00
parent 2db2003187
commit deec2cf578
2 changed files with 28 additions and 1 deletions

View File

@ -282,5 +282,5 @@ end
#
# Indexes
#
# index_drafts_on_user_id_and_draft_key (user_id,draft_key)
# index_drafts_on_user_id_and_draft_key (user_id,draft_key) UNIQUE
#

View File

@ -0,0 +1,27 @@
# frozen_string_literal: true
class AddUniqueIndexToDrafts < ActiveRecord::Migration[6.0]
def up
execute <<~SQL
DELETE FROM drafts d1
USING (
SELECT MAX(id) as id, draft_key, user_id
FROM drafts
GROUP BY draft_key, user_id
HAVING COUNT(*) > 1
) d2
WHERE
d1.draft_key = d2.draft_key AND
d1.user_id = d2.user_id AND
d1.id <> d2.id
SQL
remove_index :drafts, [:user_id, :draft_key]
add_index :drafts, [:user_id, :draft_key], unique: true
end
def down
raise ActiveRecord::IrreversibleMigration
end
end