change dùng cho các operations tự reversible — Rails biết cách đảo ngược:
ruby
def change
add_column :users, :age, :integer # down: remove_column
add_index :users, :email # down: remove_index
create_table :posts do |t| ... end # down: drop_table
endMột số operations không reversible → phải viết up/down rõ ràng:
ruby
def up
execute "UPDATE users SET role = 'member' WHERE role IS NULL"
end
def down
raise ActiveRecord::IrreversibleMigration,
"Cannot reverse a data-only migration"
endOperations không reversible: remove_column (mất data type), change_column, execute raw SQL data.
Use change for operations that are inherently reversible — Rails knows how to invert them:
ruby
def change
add_column :users, :age, :integer # down: remove_column
add_index :users, :email # down: remove_index
create_table :posts do |t| ... end # down: drop_table
endSome operations are not reversible — write explicit up/down:
ruby
def up
execute "UPDATE users SET role = 'member' WHERE role IS NULL"
end
def down
raise ActiveRecord::IrreversibleMigration,
"Cannot reverse a data-only migration"
endNon-reversible operations: remove_column (loses type info), change_column, raw SQL data mutations.