📖 Scenario: You are building a simple blog application using Rails. You want to keep track of changes to your database structure over time so that your team can work together smoothly and avoid conflicts.
🎯 Goal: Understand why Rails migrations use version numbers to manage database changes and how this helps keep the database schema consistent.
📋 What You'll Learn
Create a migration file with a specific version number
Add a configuration variable to track the current schema version
Write code to apply migrations in order based on version numbers
Complete the migration setup to ensure database consistency
💡 Why This Matters
🌍 Real World
In real projects, Rails migrations help teams safely update the database structure as the app evolves.
💼 Career
Understanding migration versioning is essential for Rails developers to manage database changes and collaborate effectively.
Progress0 / 4 steps
1
Create a migration file with a version number
Create a migration file named 20240601010101_create_posts.rb with a class called CreatePosts that inherits from ActiveRecord::Migration[7.0].
Ruby on Rails
Hint
Migration files have a timestamp prefix as their version number. The class inherits from ActiveRecord::Migration with the Rails version in brackets.
2
Add a configuration variable to track schema version
Add a variable called ActiveRecord::SchemaMigration.version and set it to the string "20240601010101" to represent the current migration version.
Ruby on Rails
Hint
The schema version is stored as a string matching the migration timestamp to track which migrations have been applied.
3
Apply migrations in order using version numbers
Write a method called apply_migrations that takes a list of migration versions and applies only those with a version greater than ActiveRecord::SchemaMigration.version.
Ruby on Rails
Hint
Compare each migration version to the current schema version and apply only newer migrations.
4
Complete migration setup for database consistency
Add a final line to call apply_migrations with the list ["20240601010101", "20240602020202"] to simulate applying migrations in order.
Ruby on Rails
Hint
Calling apply_migrations with a list of versions simulates running migrations in the correct order.
Practice
(1/5)
1. Why does Rails use version numbers in database migrations?
easy
A. To track which migrations have been applied to the database
B. To speed up database queries
C. To store user data securely
D. To create backups automatically
Solution
Step 1: Understand migration purpose
Migrations change the database structure over time.
Step 2: Role of version numbers
Version numbers help Rails know which migrations ran and which are pending.
Final Answer:
To track which migrations have been applied to the database -> Option A
Hint: Version numbers track applied migrations, not data or speed [OK]
Common Mistakes:
Thinking version numbers speed up queries
Confusing versioning with data storage
Assuming version numbers create backups
2. Which of the following is the correct way Rails names migration version numbers?
easy
A. A user-defined name without numbers
B. A random string of letters
C. A timestamp prefix like 20240612123456_create_users.rb
D. A hash of the migration content
Solution
Step 1: Identify Rails migration naming
Rails uses timestamps to order migrations chronologically.
Step 2: Confirm correct format
Migration files start with a timestamp like 20240612123456 followed by a descriptive name.
Final Answer:
A timestamp prefix like 20240612123456_create_users.rb -> Option C
Quick Check:
Migration version = timestamp prefix [OK]
Hint: Look for timestamp prefix in migration filenames [OK]
Common Mistakes:
Thinking version is random letters
Ignoring the timestamp format
Assuming user names migrations without numbers
3. Given these migrations applied in order: 20240601010101_create_users.rb 20240602020202_add_email_to_users.rb What will Rails do if you run rails db:migrate again without new migrations?
medium
A. It will apply all migrations again
B. It will skip migrations because they are already applied
C. It will delete the database
D. It will raise an error about duplicate migrations
Solution
Step 1: Understand migration tracking
Rails records applied migrations by their version numbers in a special table.
Step 2: Behavior on re-running migrations
If no new migrations exist, Rails skips already applied ones to avoid duplicate changes.
Final Answer:
It will skip migrations because they are already applied -> Option B
Quick Check:
Applied migrations are skipped on rerun [OK]
Hint: Rails skips migrations already recorded as applied [OK]
Common Mistakes:
Thinking migrations run twice
Expecting database deletion
Assuming errors on duplicate versions
4. You created a migration file but forgot to update its version timestamp. What problem will this cause when running rails db:migrate?
medium
A. Rails will ignore the migration because the version conflicts
B. Rails will apply the migration twice
C. Rails will raise a syntax error
D. Rails will rename the migration automatically
Solution
Step 1: Understand version uniqueness
Each migration version must be unique to track changes properly.
Step 2: Effect of duplicate version
If two migrations share the same version, Rails ignores the second to avoid conflicts.
Final Answer:
Rails will ignore the migration because the version conflicts -> Option A
Quick Check:
Duplicate versions cause ignored migrations [OK]
Hint: Duplicate timestamps cause migrations to be ignored [OK]
Common Mistakes:
Expecting automatic renaming
Thinking Rails applies duplicates
Assuming syntax errors from version conflicts
5. You have two developers creating migrations simultaneously. Developer A creates 20240612120000_add_age_to_users.rb and Developer B creates 20240612120000_add_status_to_users.rb. What issue arises and how should it be resolved?
hard
A. Rails will run only the first migration and ignore the second permanently
B. Rails merges both migrations automatically without issues
C. One migration overwrites the other silently
D. Both migrations have the same version causing conflicts; rename one with a unique timestamp
Solution
Step 1: Identify version conflict
Both migrations share the exact same timestamp version, which must be unique.
Step 2: Resolve conflict
To fix, rename one migration file with a different timestamp so Rails can track both separately.
Final Answer:
Both migrations have the same version causing conflicts; rename one with a unique timestamp -> Option D