Leaderboard should handle missing slack_uid

This commit is contained in:
Max Wofford 2025-03-13 17:40:03 -04:00
parent 293a6efae0
commit 5ce6176951
2 changed files with 52 additions and 3 deletions

View file

@ -0,0 +1,48 @@
class SwitchLeaderboardEntriesToUserId < ActiveRecord::Migration[8.0]
def up
# Add user_id column
add_column :leaderboard_entries, :user_id, :bigint
# Add foreign key constraint
add_foreign_key :leaderboard_entries, :users
# Migrate existing data
execute <<-SQL
UPDATE leaderboard_entries le
SET user_id = u.id
FROM users u
WHERE le.slack_uid = u.slack_uid
SQL
# Add null constraint after data is migrated
change_column_null :leaderboard_entries, :user_id, false
# Update unique index to use user_id instead of slack_uid
remove_index :leaderboard_entries, name: "idx_leaderboard_entries_on_leaderboard_and_user"
add_index :leaderboard_entries, [ :leaderboard_id, :user_id ], unique: true, name: "idx_leaderboard_entries_on_leaderboard_and_user"
# Remove slack_uid column
remove_column :leaderboard_entries, :slack_uid
end
def down
# Add back slack_uid column
add_column :leaderboard_entries, :slack_uid, :string
# Migrate data back
execute <<-SQL
UPDATE leaderboard_entries le
SET slack_uid = u.slack_uid
FROM users u
WHERE le.user_id = u.id
SQL
# Remove user_id column and its foreign key
remove_foreign_key :leaderboard_entries, :users
remove_column :leaderboard_entries, :user_id
# Restore original index
remove_index :leaderboard_entries, name: "idx_leaderboard_entries_on_leaderboard_and_user"
add_index :leaderboard_entries, [ :leaderboard_id, :slack_uid ], unique: true, name: "idx_leaderboard_entries_on_leaderboard_and_user"
end
end

7
db/schema.rb generated
View file

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema[8.0].define(version: 2025_03_12_172534) do
ActiveRecord::Schema[8.0].define(version: 2025_03_13_205725) do
# These are extensions that must be enabled in order to support this database
enable_extension "pg_catalog.plpgsql"
@ -155,12 +155,12 @@ ActiveRecord::Schema[8.0].define(version: 2025_03_12_172534) do
create_table "leaderboard_entries", force: :cascade do |t|
t.bigint "leaderboard_id", null: false
t.string "slack_uid", null: false
t.integer "total_seconds", default: 0, null: false
t.integer "rank"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.index ["leaderboard_id", "slack_uid"], name: "idx_leaderboard_entries_on_leaderboard_and_user", unique: true
t.bigint "user_id", null: false
t.index ["leaderboard_id", "user_id"], name: "idx_leaderboard_entries_on_leaderboard_and_user", unique: true
t.index ["leaderboard_id"], name: "index_leaderboard_entries_on_leaderboard_id"
end
@ -258,6 +258,7 @@ ActiveRecord::Schema[8.0].define(version: 2025_03_12_172534) do
add_foreign_key "email_addresses", "users"
add_foreign_key "heartbeats", "users"
add_foreign_key "leaderboard_entries", "leaderboards"
add_foreign_key "leaderboard_entries", "users"
add_foreign_key "project_repo_mappings", "users"
add_foreign_key "sign_in_tokens", "users"
end