DataMapper In 20 min

33
DataMapper in 20 min

description

Overview of DataMapper and the differences between DM and other Ruby ORMs. Presentation given by Matt Aimonetti during MerbCamp 2008 in San Diego, CA.

Transcript of DataMapper In 20 min

Page 1: DataMapper In 20 min

DataMapper

i n 2 0 m i n

Page 2: DataMapper In 20 min

MeMatt

Aimonetti

irc: m a t t e t t i

Page 3: DataMapper In 20 min

MeC o n s u l t a n tbased in San Diego, CA

Page 4: DataMapper In 20 min

Blogs:http://merbist.com

http://railsontherun.com

Page 5: DataMapper In 20 min

DataMapper i n 2 0 m i n

Object Relational Mapper

DM=

Page 6: DataMapper In 20 min

DataMapper i n 2 0 m i n

Databases

Object OrientedLanguages

scalar values

objects

ORM

data

Page 7: DataMapper In 20 min

DataMapper i n 2 0 m i n

SELECT * FROM BookWHERE price > 100.00ORDER BY title;

Raw SQL statements FTL

Page 8: DataMapper In 20 min

DataMapper i n 2 0 m i n

Book.all( :price.gt => 100.00, :order => [:title.asc] )

Pure Ruby FTW

Page 9: DataMapper In 20 min

DataMapper i n 2 0 m i n

Book.find( :all, :conditions => ["price > ?", 100.00],:order => "title" )

¿SQL/Ruby FAIL?

Page 10: DataMapper In 20 min

DataMapper i n 2 0 m i n

DM is MORE THAN THAT

Page 11: DataMapper In 20 min

DataMapper i n 2 0 m i n

@parent = Parent.find_by_name("Bob")

@parent.children.each do |child| @parent.object_id.should == child.parent.object_idend

identity map

FAILS with ActiveRecord

PASSES with DataMapper

Page 12: DataMapper In 20 min

DataMapper i n 2 0 m i n

Does what ActiveRecord doesbut differently

Page 13: DataMapper In 20 min

DataMapper i n 2 0 m i n

Data Objects

db drivers using 1 unified interface

Cop

yrig

ht -

Mer

b in

Act

ion

- M

anni

ng

Page 14: DataMapper In 20 min

DataMapper i n 2 0 m i n

Lazy loading+

Strategic Eager Loader

Procrastinationbecomes anORM value

Page 15: DataMapper In 20 min

DataMapper i n 2 0 m i n Lazy loading + SEL

#first, #each, #count, #map...DM only generates a query when encountering a kicker

Page 16: DataMapper In 20 min

DataMapper i n 2 0 m i n

zoos = Zoo.allzoos.each do |zoo| zoo.exhibits.map{|e| e.name}end

Lazy loading + SEL

Page 17: DataMapper In 20 min

DataMapper i n 2 0 m i n

SELECT * FROM "zoos" SELECT * FROM "exhibits" WHERE ("exhibits".zoo_id = 1) SELECT * FROM "exhibits" WHERE ("exhibits".zoo_id = 2) SELECT * FROM "exhibits" WHERE ("exhibits".zoo_id = 3)

ActiveRecord4 requests

Lazy loading + SEL

Page 18: DataMapper In 20 min

DataMapper i n 2 0 m i n

SELECT "id", "name" FROM "zoos" ORDER BY "id"SELECT "id", "name", "zoo_id" FROM "exhibits" WHERE ("zoo_id" IN (1, 3, 2)) ORDER BY "id"

DataMapper2 requests

Lazy loading + SEL

Page 19: DataMapper In 20 min

DataMapper i n 2 0 m i n Lazy load

DM doesn’t load all properties for each request

unless required

Page 20: DataMapper In 20 min

DataMapper i n 2 0 m i n Multiple Repos

production: adapter: mysql encoding: utf8 database: production-app username: root password: top-s3ckit host: localhost repositories: nightly_backup: adapter: sqlite3 database: shared/nightly.db weekly_backup: adapter: sqlite3 database: shared/weekly.db

data

base

.ym

l

Page 21: DataMapper In 20 min

DataMapper i n 2 0 m i n Multiple Repos

Article.copy(:default, :nightly_backup, :created.gt => 1.day.ago )

Page 22: DataMapper In 20 min

DataMapper i n 2 0 m i n Multiple Repos

Article.copy(:nightly_backup, :weekly_backup, :created.gt => 1.week.ago )

Page 23: DataMapper In 20 min

DataMapper i n 2 0 m i n Legacy Data

class Page include DataMapper::Resource property :id, Serial property :name, String repository(:legacy) do property :name, String, :field => "title" end

Page 24: DataMapper In 20 min

DataMapper i n 2 0 m i n Adapters

Provide an interface between your models

and a data store.

Page 25: DataMapper In 20 min

DataMapper i n 2 0 m i n Adapters

imapfile system

salesforce APIREST

couchdbferret

google video - http scraper

Page 26: DataMapper In 20 min

DataMapper i n 2 0 m i n Lazy Attributes

google video - http scraperDM adapter

80 LOC

only required to implement - a read method

- handling query conditions

Page 27: DataMapper In 20 min

DataMapper i n 2 0 m i n Lazy Attributes

Sales Force read-writeDM adapter

200 LOC

Page 28: DataMapper In 20 min

DataMapper i n 2 0 m i n Migrations

automigrateautoupdatemigration

Page 29: DataMapper In 20 min

DataMapper i n 2 0 m i n Custom Types

Load / Dump

Page 30: DataMapper In 20 min

DataMapper i n 2 0 m i n

modular structure

Plugins

migration, validation, model factory, state machine, constraints, lists, tagging...

DM facilitates extensions by offering nice hooks

Page 31: DataMapper In 20 min

DataMapper i n 2 0 m i n

Person.all(Person.addresses.street.like => "%street%" )

SELECT "people"."id", "people"."name" FROM "people"INNER JOIN "addresses" ON ("people"."id" = "addresses"."person_id")WHERE ("addresses"."street" LIKE '%street%')ORDER BY "people"."id"

Query::Path

Find all people with an address that has street in the street name

Page 32: DataMapper In 20 min

DataMapper i n 2 0 m i n

Person.all("addresses.street.like" => "%street%" )

SELECT "people"."id", "people"."name" FROM "people"INNER JOIN "addresses" ON ("people"."id" = "addresses"."person_id")WHERE ("addresses"."street" LIKE '%street%')ORDER BY "people"."id"

Query::Path

Find all people with an address that has street in the street name

Page 33: DataMapper In 20 min

DataMapper i n 2 0 m i n

people who helped with this presentation:

Credits

dbussink, dkubb, afrench, wycats