diff --git a/db/migrate/20240503131630_add_unique_constraint_to_view_states.rb b/db/migrate/20240503131630_add_unique_constraint_to_view_states.rb new file mode 100644 index 000000000..c00a21fe7 --- /dev/null +++ b/db/migrate/20240503131630_add_unique_constraint_to_view_states.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class AddUniqueConstraintToViewStates < ActiveRecord::Migration[7.0] + def up + # delete the duplicates + execute 'WITH uniq AS + (SELECT DISTINCT ON (user_id, viewable_id, viewable_type) * FROM view_states) + DELETE FROM view_states WHERE view_states.id NOT IN + (SELECT id FROM uniq)' + + # add index + add_index :view_states, %i(user_id viewable_id viewable_type), unique: true + end + + def down + remove_index :view_states, columns: %i(user_id viewable_id viewable_type) + end +end diff --git a/db/schema.rb b/db/schema.rb index 758512996..4c04d2527 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1294,6 +1294,7 @@ ActiveRecord::Schema[7.0].define(version: 2024_01_18_094253) do t.bigint "viewable_id" t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false + t.index ["user_id", "viewable_id", "viewable_type"], name: "index_view_states_on_user_id_and_viewable_id_and_viewable_type", unique: true t.index ["user_id"], name: "index_view_states_on_user_id" t.index ["viewable_type", "viewable_id"], name: "index_view_states_on_viewable_type_and_viewable_id" end