class CreateProfiles < ActiveRecord::Migration[5.2]
  def change
    create_table :profiles do |t|
      t.references :user, index: true, foreign_key: true
      t.string :display_name, length: 50
      t.string :description, length: 200, null: false, default: ''
      t.string :location, length: 72, null: false, default: ''
      t.string :website, null: false, default: ''
      t.string :motivation_header, null: false, default: ''

      t.timestamps
    end

    User.find_each do |user|
      Profile.create!(
        user_id: user.id,
        display_name: user.display_name,
        description: user.bio,
        location: user.location,
        website: user.website,
      )
    end
  end
end

class CreateProfiles < ActiveRecord::Migration[5.2]
  def change
    create_table :profiles do |t|
      t.references :user, index: true, foreign_key: true
      t.string :display_name, length: 50
      t.string :description, length: 200, null: false, default: ''
      t.string :location, length: 72, null: false, default: ''
      t.string :website, null: false, default: ''
      t.string :motivation_header, null: false, default: ''

      t.timestamps
    end

    transaction do
      execute 'INSERT INTO profiles (user_id, display_name, description, location, website, motivation_header, created_at, updated_at) SELECT users.id as user_id, users.display_name, users.bio as description, users.location, users.website, users.motivation_header, users.created_at, users.updated_at FROM users;'

      remove_column :users, :display_name
      remove_column :users, :bio
      remove_column :users, :location
      remove_column :users, :website
      remove_column :users, :motivation_header
    end
  end
end

Use an INSERT INTO ... SELECT to move profile data and drop the old columns
Use an INSERT INTO ... SELECT to move profile data and drop the old columns
