Bird
Raised Fist0
Ruby on Railsframework~10 mins

Changing column types in Ruby on Rails - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Changing column types
Generate Migration
↓
Edit Migration File
↓
Run Migration
↓
Database Column Type Changes
↓
Schema Updated
This flow shows how to change a database column type in Rails by creating and running a migration that updates the schema.
Execution Sample
Ruby on Rails
class ChangeAgeToStringInUsers < ActiveRecord::Migration[7.0]
  def change
    change_column :users, :age, :string
  end
end
This migration changes the 'age' column type in the 'users' table from its current type to string.
Execution Table
StepActionMigration File ContentDatabase Schema ChangeResult
1Generate migrationrails generate migration ChangeAgeToStringInUsersNo change yetMigration file created
2Edit migrationchange_column :users, :age, :stringNo change yetMigration file ready
3Run migrationchange_column :users, :age, :stringColumn 'age' type changed to stringSchema updated
4Verify schemaN/ASchema shows 'age' as stringChange confirmed
5ExitN/ANo further changesProcess complete
💡 Migration run completes and schema reflects new column type
Variable Tracker
VariableStartAfter Migration RunFinal
users.age column typeinteger (or original)stringstring
Key Moments - 2 Insights
Why doesn't the column type change immediately after generating the migration?
Because generating the migration only creates a file; the database schema changes only after running the migration (see execution_table step 3).
What happens if the column has data incompatible with the new type?
The migration may fail or data may be lost; you should handle data conversion carefully before changing the column type.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, at which step does the database schema actually change?
AStep 1
BStep 3
CStep 2
DStep 4
💡 Hint
Check the 'Database Schema Change' column in the execution_table rows
According to the variable tracker, what is the final type of the 'age' column after migration?
Ainteger
Bboolean
Cstring
Dfloat
💡 Hint
Look at the 'Final' column for 'users.age column type' in variable_tracker
If you forget to run the migration after generating it, what will the schema show?
AThe column type will remain the same
BThe column type will be changed
CThe database will be empty
DAn error will occur automatically
💡 Hint
Refer to execution_table steps 1 and 2 where schema remains unchanged
Concept Snapshot
Changing column types in Rails:
1. Generate a migration file.
2. Edit it using change_column :table, :column, :new_type.
3. Run rails db:migrate to apply.
4. Schema updates to new type.
Always backup data before changing types.
Full Transcript
To change a column type in Rails, first generate a migration file using the command 'rails generate migration'. Then edit the migration file to include the change_column method specifying the table, column, and new type. Running 'rails db:migrate' applies the change to the database schema. The schema now reflects the new column type. Remember, generating the migration file alone does not change the database; you must run the migration. Also, be cautious with existing data as incompatible types can cause errors or data loss.

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