Dynamically Updating Enum Values Without Breaking Records

A common problem occurs when changing enum values after data is stored. If not handled correctly, existing records can break.

Problem: Changing Enum Values Can Corrupt Data

Consider a scenario where we rename an enum key:

#Before
enum :status, { active: 0, inactive: 1, banned: 2 }

#After
enum :status, { enabled: 0, disabled: 1, banned: 2 }

Now, all users who were active (0) are suddenly treated as enabled—which might be unintended.

Solution: Migrating Enum Data Safely

If you need to rename or change enum values, follow these steps:

Step 1: Add the New Enum Temporarily

Modify the model:

enum :status, { active: 0, inactive: 1, banned: 2, enabled: 3 }

Step 2: Migrate Data Safely

Run the migration:

User.where(status: :active).update_all(status: :enabled)

Step 3: Remove the Old Enum

Once all records are migrated, remove the old enum:

enum :status, { enabled: 0, inactive: 1, banned: 2 }

This ensures a smooth transition without corrupting data.