mirror of
https://github.com/discourse/discourse.git
synced 2025-02-06 03:18:23 +00:00
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:
parent
2db2003187
commit
deec2cf578
@ -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
|
||||
#
|
||||
|
27
db/migrate/20191108000414_add_unique_index_to_drafts.rb
Normal file
27
db/migrate/20191108000414_add_unique_index_to_drafts.rb
Normal 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
|
Loading…
x
Reference in New Issue
Block a user