This document provides an overview of data modeling with Active Record in Ruby on Rails. It discusses how web applications differ from static websites by retrieving and presenting dynamic data from a model. It then explains that Rails uses a relational database to store data and ActiveRecord to interact with it through objects and queries. It provides examples of modeling data for cheeses, types, and stores with ActiveRecord classes and associations, and examples of common ActiveRecord queries and operations. The document stresses that migrations are key to setting up the database schema that ActiveRecord relies on.
2. About Me:
Hannah Howard
Twitter: @techgirlwonder
Email: hannah@techgirlwonder.com
I run my own computer services business called
Tech Girl Wonder.And Im hiring.
I do ruby programming with Logical Reality Design,
a Rails development shop. Hire us!
3. This is my take on the subject, not the one true way.
For the smarty pants in the room, Im skipping over a lot.
Possibly even saying things that arent always true.
There will be time for questions.
This is not a lecture, only the first 15-30 minutes are.
A Few CAVEATS
4. Why This Talk?
I think Ive noticed some patterns in where new people get
stuck learning Rails
I think it has to do with the parts of Rails that are closer to
traditional computer programming and very different from
HTML/CSS
Specifically, I think people get stuck on the M in the MVC,
i.e ActiveRecord and its connection to an SQL database.
8. WHAT IS THE MODEL?
A model of data represented by the application
Rails stores its data in a relational database. (usually)
You access data in relational databases with SQL queries
SQL queries are complex and hard to write
ActiveRecord is there to make that easier and better
9. What is A RELATIONAL
DATABASE?
A series of data tables (like Excel spreadsheets) that are
connected to each other through relationships
Hint: Spend some time with Filemaker or Access
10. RelationAL Database Example
Id Weight Stale
1 6oz TRUE
2 8oz FALSE
3 5oz FALSE
Id Name Country
1 Swiss Switzerland
2 American U.S.
3 Harvarty Denmark
Id Name Address
1 Cheesetopia 123 Fake St.
2 I Love Cheese 8675 Threeonine Ave.
3 Bobs Cheeses 1 Infinite Loop
Cheese Types
Cheeses
Cheese Shops
Id Weight Stale TypeID ShopID
1 6oz TRUE 1 2
2 8oz FALSE 3 3
3 5oz FALSE 2 1
Have
Many Have
Many
Have
Many
Have
Many
Belongs
To
Belongs
To
TypeID ShopID
3 2
1 2
2 1
1 1
3 3
2 3
11. SQL: Standard Query Lanaguage
SELECT * FROM CHEESES
INNER JOIN
CHEESE_TYPES ON
cheeses.cheese_type_id =
cheese_types.id WHERE
cheese_types.name IN
[SWISS,HARVARTI]
WHERE cheeses.stale =
FALSE
12. AcTIVERECORD
Cheese Types
class CheeseType < ActiveRecord::Base
has_many :cheeses
has_and_belongs_to_many :cheese_stores
attr_accessible :name, :country
end
Cheeses
class Cheese < ActiveRecord::Base
belongs_to :cheese_type
belongs_to :cheese_store
attr_accessible :weight, :stale
end
Cheese Stores
class CheeseStore < ActiveRecord::Base
has_many :cheeses
has_and_belongs_to_many :cheese_types
attr_accessible :name, :address
13. WoRKING WITH ACTIVE
RECORD
cheese_type.country = France
cheese.cheese_store
cheese_store.cheese_types
Cheese.where(:weight => 4.0..10.0)
Cheese.joins(:cheese_types).where(cheese_types: {name:
[SWISS,HAVARTI]}).where(:stale => false)
14. The KEY PIECE OF GLUE:
Migrationsrails generate model cheeses weight:decimal stale:boolean cheese_type_id:integer
cheese_store_id:integer
class CreateCheeses < ActiveRecord::Migration
def change
create_table :cheeses do |t|
t.decimal :weight
t.boolean :stale
t.integer :cheese_type_id
t.integer :cheese_store_id
t.timestamps
end
end
end
Oh wait, so thats what rake db:migrate does!