Issues with migrations in Ruby on Rails (09 feb 13)
The biggest problem I have encountered with migrations is this:
You add a field to a model. You add validation for that field. You write a migration that adds that column to the table corresponding to that model. It works in development and test. You send it to a customer who has code which is several versions old. They try to run several migrations. They break, because they load the new app with the new model, which refers to columns which don't exist in their old database.
== RenameLoginToEmail: migrating =============================================
-- rename_column(:users, :login, :email)
rake aborted!
An error has occurred, all later migrations canceled:
No such column: users.login
Here's a workaround - db/migrate/20130211000000_rename_login_to_email.rb:
class RenameLoginToEmail < ActiveRecord::Migration
def self.up
begin
rename_column :users, :login, :email
rescue Exception => x
raise x unless x.message =~ /No.+column.+login/i
end
end
def self.down
begin
rename_column :users, :email, :login
rescue Exception => x
raise x unless x.message =~ /No.+column.+email/i
end
end
end
What's really needed is a way of tying migrations to source control. Checkout code version N. Run migration N. Checkout code version N+1. Run migration N+1 etc..
More:
http://simononsoftware.com/why-ruby-on-rails-migrations-dont-work