Migrations, the "right" way

I've got the Agile Web Development with Rails book that tells me to do
migrations different than the what is explained on api.rubyonrails.org
under ActiveRecord::Migration

What is the "best" or "right" syntax of migrations?

For those of us who don’t own the book,

How does the book tell you to do it?

ActiveRecord::Migration on the api.rubyonrails.org seems to be the new syntax, where AWDWR will probably be the older (but not deprecated) syntax.

Sexy migrations is syntactic sugar. It is generally preferred.

Here is an example from the book:

class CreateProducts < ActiveRecord::Migration
  def self.up
    create_table :products do |t|
      t.column :title, :string
      t.column :description, :text
      t.column :image_url, :string
    end
  end

  def self.down
    drop_table :products
  end
end

what are "sexy migrations"?

Basically, the rails core realized that the 'column' call was
redundant within the context of a table definition so you can now do
the following

create_table :products do |t|
  t.column :title, :string
  t.column :description, :text
  t.column :image_url, :string
end

Like this:

create_table :products do |t|
  t.string :title
  t.text :description
  t.string :image_url
end

..or..

create_table :products do |t|
  t.string :title, :image_url
  t.text :description
end

What I personally find "sexier" is the syntax that makes references to
other tables more explicit. For example, if a line_item referred to
the product table you used to do this:

create_table :line_items do |t|
  t.column :product_id, :integer
end

But now...

create_table :line_items do |t|
  t.references :product
end

And you can have even sexier polymorphic associations

create_table :addresses do |t|
  t.references :addressable, :polymorphic=>true
end

That gives you :addressable_type and :addressable_id with a syntax
that looks remarkably like the one you'll have in your Address class.

Thanks AndyV

When I try this syntax I get this error:

rake aborted!
undefined method `integer' for
#<ActiveRecord::ConnectionAdapters::TableDefinition:0x421d3e8>

I just updated rails to 2.0.2, is there something I'm missing?

nevermind, I found the answer here: http://www.railsforum.com/viewtopic.php?id=17431

what are “sexy migrations”?

Migrations with sexy lace and a single rose clutched between it’s teeth:

Instead of your old, tired cellulite ridden migrations:

def self.up

create_table :posts do |t|
t.column :created_at, :datetime

t.column :updated_at, :datetime
t.column :title, :string

t.column :slug, :string
t.column :text, :text
t.column :user_id, :integer

end

end

Your younger, fresh, sexy migrations:
def self.up
create_table :posts do |t|
t.timestamps
t.string :title, :slug
t.text :text
t.references :user
end
end

insert mandatory wolf whistle here