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?
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