Download presentation
Presentation is loading. Please wait.
1
Agile Web Development with Ruby and Rails
Prof. Paul Krause Lecture 7 Migrations and Active Record
2
Objectives for today A Look at Migrations
From Migrations to Active Record Rails’ Object-Relation Mapping More on Rails Controllers
4
20091030111023_add_price_to_product
class AddPriceToProduct < ActiveRecord::Migration def self.up add_column :products, :price, :decimal end def self.down remove_column :products, :price
6
20091030111023_add_price_to_product
class AddPriceToProduct < ActiveRecord::Migration def self.up add_column :products, :price, :decimal, :precision => 8, :scale => 2, :default => 0 end def self.down remove_column :products, :price
9
Two ways of Generating Migrations
Create a Model E.g. generating a model called Discount will also generate a migration: dddddddddddddd_create_discounts.rb Generate a migration on its own E.g. Generate/Migration add_price_column You then need to ask Rails to run a “Rake” task to migrate to the new version
10
Anatomy of a migration class AddPriceToProduct < ActiveRecord::Migration def self.up add_column :products, :price, :decimal, :precision => 8, :scale => 2, :default => 0 end
11
Anatomy of a migration class AddPriceToProduct < ActiveRecord::Migration def self.up add_column :products, :price, :decimal, :precision => 8, :scale => 2, :default => 0 end def self.down remove_column :products, :price
12
Column Types add_column :orders, :e-mail, :string
The third parameter specifies the type of the database column. But databases typically don’t have :string as a type? Rails insulates you from the underlying database by using “logical types” E.g. :string type will generate a column of type varchar(255) in MySQL
13
Column Options :null => true or false :limit => size
:default => value N.B. the value is determined at the time of application of the migration: add_column :orders, :placed_at, :datetime, :default => Time.now decimal columns also support the options :precision and :scale
14
Summary of migration types
Create tables Add columns Rename columns Change the type, or options, of columns Rename tables
15
Warning about renaming tables
If you rename a table (e.g. order_histories -> order_notes), you will also need to rename the associated model (e.g. OrderHistory -> OrderNote) Now, suppose you wish to drop the database, and then reapply all migrations? Rerunning the migration to create the table order_histories will generate an exception, as the associated model has been renamed! There are ways around this, but be aware that Rails migrations are not foolproof...
16
Primary Keys You will not normally explicitly define a primary key
Rails assumes: every table has a numeric (integer) primary key (called id) Rails ensures the value of this column is unique for each row added to the database You can change the name of the primary key: create_table :tickets, :primary_key => :number do |t| .. But it is not a good idea to change the type from an integer
17
Primary Keys You will not normally explicitly define a primary key
Rails assumes: every table has a numeric (integer) primary key (called id) Rails ensures the value of this column is unique for each row added to the database You can change the name of the primary key: create_table :tickets, :primary_key => :number do |t| .. But it is not a good idea to change the type from an integer
18
Tables with no Primary Key
The most common case for this is a join table Need to explicitly tell Rails not to generate a primary key: create_table :authors_books, :id => false do |t| t.integer :author_id, :null => false t.integer :book_id, :null => false end
19
From Migrations to Active Record
20
Active Record This is Rails’ Object-Relational mapping:
Tables map to classes; Rows map to objects; Columns map to object attributes. The “Rails way” is to use sensible defaults to minimise the configuration needed
21
Simple Example that Does a Lot...
ActiveRecord::Base.establish_connection(:adapter => “jdbcmysql”, :database => “development” class Order < ActiveRecord::Base end end order = Order.find(1) order.name = “Paul Krause” order.save Connect to the database Wrap the table of Orders in the database Find the order with a specific ID Change the purchaser’s name Save the result back in the database
22
More on the slides from Sun Microsystems ...
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.