== Creating A Migration ==

=== Creating a model ===

The model and scaffold generators will create migrations appropriate for adding a new model. This migration will already contain instructions for creating the relevant table. If you tell Rails what columns you want then statements for adding those will also be created. For example, running

`ruby script/generate model Product name:string description:text` will create a migration that looks like this

[source, ruby]
-----------------------
class CreateProducts < ActiveRecord::Migration
  def self.up
    create_table :products do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end

  def self.down
    drop_table :products
  end
end
-----------------------

You can append as many column name/type pairs as you want. By default `t.timestamps` (which creates the `updated_at` and `created_at` columns that
are automatically populated by Active Record) will be added for you.

=== Creating a standalone migration ===
If you are creating migrations for other purposes (for example to add a column to an existing table) then you can use the migration generator:

`ruby script/generate migration AddPartNumberToProducts`

This will create an empty but appropriately named migration:

[source, ruby]
-----------------------
class AddPartNumberToProducts < ActiveRecord::Migration
  def self.up
  end

  def self.down
  end
end
-----------------------

If the migration name is of the form AddXXXToYYY or RemoveXXXFromY and is followed by a list of column names and types then a migration containing
the appropriate add and remove column statements will be created.

`ruby script/generate migration AddPartNumberToProducts part_number:string`

will generate

[source, ruby]
-----------------------
class AddPartNumberToProducts < ActiveRecord::Migration
  def self.up
    add_column :products, :part_number, :string
  end

  def self.down
    remove_column :products, :part_number
  end
end
-----------------------

Similarly,

`ruby script/generate migration RemovePartNumberFromProducts part_number:string`

generates

[source, ruby]
-----------------------
class RemovePartNumberFromProducts < ActiveRecord::Migration
  def self.up
    remove_column :products, :part_number
  end

  def self.down
    add_column :products, :part_number, :string
  end
end
-----------------------

You are not limited to one magically generated column, for example

`ruby script/generate migration AddDetailsToProducts part_number:string price:decimal`

generates

[source, ruby]
-----------------------
class AddDetailsToProducts < ActiveRecord::Migration
  def self.up
    add_column :products, :part_number, :string
    add_column :products, :price, :decimal
  end

  def self.down
    remove_column :products, :price
    remove_column :products, :part_number
  end
end
-----------------------

As always, what has been generated for you is just a starting point. You can add or remove from it as you see fit.

