Search code examples
ruby-on-railsdata-migrationrails-migrations

How do I move a column (with contents) to another table in a Rails migration?


I need to move some columns from one existing table to another. How do I do it using a rails migration?

class AddPropertyToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :someprop, :string
    remove_column :profiles, :someprop
  end

  def self.down
    add_column :profiles, :someprop, :string
    remove_column :users, :someprop
  end
end

The above just creates the new columns, but values are left empty...

I want to avoid logging in to the database to manually update the tables.

If there is a way to move column values programmatically, what are the performance characteristics? Would it do row-by-row, or is there a way to update in bulk?


Solution

  • I ended up using this migration (tested, it works, and rolls back successfully):

    class AddPropertyToUser < ActiveRecord::Migration
      def self.up
        add_column :users, :someprop, :string
        execute "UPDATE users u, profiles p SET u.someprop = p.someprop WHERE u.id = p.user_id"
        remove_column :profiles, :someprop
      end
    
      def self.down
        add_column :profiles, :someprop, :string
        execute "UPDATE profiles p, users u SET p.someprop = u.someprop WHERE p.user_id = u.id"
        remove_column :users, :someprop
      end
    end
    

    I like it because it avoids the row-by-row updates on a large database.