Read more

Rails 3.1 gives you free down migrations

Henning Koch
July 09, 2012Software engineer at makandra GmbH

In Rails 3.1+, instead of defining a separate up and down method you can define a single method change:

class AddComparisonFieldsToReport < ActiveRecord::Migration
  def change
    add_column :reports, :compare, :boolean
    update "UPDATE reports SET compare = #{quoted_false}"
    add_column :reports, :compare_start_date, :date
    add_column :reports, :compare_end_date, :date
  end
end
Illustration online protection

Rails Long Term Support

Rails LTS provides security patches for old versions of Ruby on Rails (2.3, 3.2, 4.2 and 5.2)

  • Prevents you from data breaches and liability risks
  • Upgrade at your own pace
  • Works with modern Rubies
Read more Show archive.org snapshot

Migrating up works as expected:

b rake db:migrate
==  AddComparisonFieldsToReport: migrating ====================================
-- add_column(:reports, :compare, :boolean)
   -> 0.0274s
-- quoted_false()
   -> 0.0000s
-- update("UPDATE reports SET compare = 0")
   -> 0.0018s
   -> 2 rows
-- add_column(:reports, :compare_start_date, :date)
   -> 0.0610s
-- add_column(:reports, :compare_end_date, :date)
   -> 0.0451s
==  AddComparisonFieldsToReport: migrated (0.1358s) ===========================

Migrating down also works as expected. Note how destructive commands that cannot be reverted (update) are simply skipped:

b rake db:rollback
==  AddComparisonFieldsToReport: reverting ====================================
-- remove_column("reports", :compare_end_date)
   -> 0.0699s
-- remove_column("reports", :compare_start_date)
   -> 0.0448s
-- remove_column("reports", :compare)
   -> 0.0294s
==  AddComparisonFieldsToReport: reverted (0.1444s) ===========================

Posted by Henning Koch to makandra dev (2012-07-09 11:31)