Bird
Raised Fist0
Ruby on Railsframework~15 mins

Changing column types in Ruby on Rails - Mini Project: Build & Apply

Choose your learning style10 modes available
Changing column types in Rails migrations
📖 Scenario: You are working on a Rails app that manages a library. You need to update the database to change the data type of a column to better fit the data it will hold.
🎯 Goal: Create a Rails migration to change the data type of the published_year column in the books table from string to integer.
📋 What You'll Learn
Create a migration file named ChangePublishedYearTypeInBooks
Use the change_column method to change published_year from string to integer
Ensure the migration is reversible
Use the correct Rails migration syntax
💡 Why This Matters
🌍 Real World
Changing column types is common when app requirements evolve and data needs to be stored differently.
💼 Career
Rails developers often write migrations to update database schemas safely and maintainably.
Progress0 / 4 steps
1
Create the migration class
Create a migration class named ChangePublishedYearTypeInBooks that inherits from ActiveRecord::Migration[7.0].
Ruby on Rails
Hint

Start by defining a class with the exact name and inheritance shown.

2
Add the change method
Inside the ChangePublishedYearTypeInBooks class, add a change method definition.
Ruby on Rails
Hint

The change method is where you put migration instructions.

3
Use change_column to modify the column type
Inside the change method, use change_column to change the published_year column in the books table from string to integer.
Ruby on Rails
Hint

Use change_column :books, :published_year, :integer inside the change method.

4
Complete the migration class
Ensure the migration class is complete with the change method containing the change_column call and properly closed with end.
Ruby on Rails
Hint

Check that all parts of the class and method are present and closed properly.

Practice

(1/5)
1.

What is the primary Rails method used to change the type of an existing database column in a migration?

easy
A. change_column
B. rename_column
C. add_column
D. remove_column

Solution

  1. Step 1: Understand migration methods

    Rails migrations provide specific methods for altering tables. add_column adds new columns, remove_column deletes columns, and rename_column changes column names.
  2. Step 2: Identify method for changing column type

    The method change_column is designed to change the type of an existing column without removing it.
  3. Final Answer:

    change_column -> Option A
  4. Quick Check:

    Change column type = change_column [OK]
Hint: Use change_column to modify column types in migrations [OK]
Common Mistakes:
  • Confusing change_column with rename_column
  • Trying to use add_column to change type
  • Using remove_column instead of changing type
2.

Which of the following is the correct syntax to change a column named price to type decimal with precision 8 and scale 2 in a Rails migration?

class ChangePriceTypeInProducts < ActiveRecord::Migration[7.0]
  def change
    ?
  end
end
easy
A. change_column :products, :price, :decimal, precision: 8, scale: 2
B. change_column :products, :price, :decimal(8,2)
C. change_column :products, :price, :decimal, {precision: 8, scale: 2}
D. change_column :products, :price, :decimal, precision => 8, scale => 2

Solution

  1. Step 1: Review change_column syntax

    The correct syntax uses symbol keys for options: change_column(table, column, type, options). Options like precision and scale are passed as keyword arguments.
  2. Step 2: Identify correct option format

    change_column :products, :price, :decimal, precision: 8, scale: 2 correctly uses precision: 8, scale: 2 as keyword arguments. change_column :products, :price, :decimal(8,2) uses invalid syntax. change_column :products, :price, :decimal, {precision: 8, scale: 2} uses a hash but without keyword arguments. change_column :products, :price, :decimal, precision => 8, scale => 2 uses hash rockets which is invalid in this context.
  3. Final Answer:

    change_column :products, :price, :decimal, precision: 8, scale: 2 -> Option A
  4. Quick Check:

    Keyword args for options = change_column :products, :price, :decimal, precision: 8, scale: 2 [OK]
Hint: Use keyword arguments for options in change_column [OK]
Common Mistakes:
  • Using parentheses in type declaration like :decimal(8,2)
  • Passing options as a hash without keywords
  • Using old hash rocket syntax in options
3.

Given this migration snippet, what will be the new type of the age column after running it?

class ChangeAgeTypeInUsers < ActiveRecord::Migration[7.0]
  def change
    change_column :users, :age, :string
  end
end
medium
A. integer
B. boolean
C. string
D. float

Solution

  1. Step 1: Read the change_column call

    The method call changes the age column in the users table to type :string.
  2. Step 2: Understand the effect

    After running the migration, the age column will store string values instead of its previous type.
  3. Final Answer:

    string -> Option C
  4. Quick Check:

    change_column to :string = string [OK]
Hint: Look at the third argument of change_column for new type [OK]
Common Mistakes:
  • Assuming the type stays the same
  • Confusing column name with type
  • Thinking change_column renames columns
4.

What is wrong with this migration code that tries to change a column type?

class ChangeActiveToBooleanInUsers < ActiveRecord::Migration[7.0]
  def change
    change_column :users, :active, 'boolean'
  end
end
medium
A. The column name should be a string, not a symbol
B. The type should be a symbol, not a string
C. change_column cannot change to boolean type
D. The migration class name is invalid

Solution

  1. Step 1: Check argument types in change_column

    The method expects the type argument as a symbol, e.g., :boolean, not a string.
  2. Step 2: Identify the error

    Using a string like 'boolean' will cause a syntax or runtime error because Rails expects symbols for types.
  3. Final Answer:

    The type should be a symbol, not a string -> Option B
  4. Quick Check:

    Type argument must be symbol = The type should be a symbol, not a string [OK]
Hint: Use symbols (e.g., :boolean) for types in change_column [OK]
Common Mistakes:
  • Passing type as a string instead of symbol
  • Thinking change_column can't handle boolean
  • Misnaming migration class
5.

You want to change a column rating from integer to decimal with precision 3 and scale 1, but keep existing data safe. Which approach is best?

hard
A. Use change_column :table, :rating, :decimal, precision: 3, scale: 1 directly in one migration
B. Change the column type in the database manually without migration
C. Drop the column and add a new decimal column with the same name
D. Create a new decimal column, copy data with conversion, then remove old column and rename new one

Solution

  1. Step 1: Understand risks of direct change_column

    Directly changing column type can cause data loss or errors if existing data doesn't fit new type.
  2. Step 2: Use safe migration strategy

    Creating a new column, copying data with conversion, then removing old column and renaming new one ensures data safety and rollback ability.
  3. Final Answer:

    Create a new decimal column, copy data with conversion, then remove old column and rename new one -> Option D
  4. Quick Check:

    Safe type change = create-copy-rename [OK]
Hint: Avoid direct type change; copy data safely first [OK]
Common Mistakes:
  • Directly changing type risking data loss
  • Dropping column without backup
  • Changing DB manually without migration
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard