datamapper in 20 min

33
DataMapper in 20 min

Upload: matt-aimonetti

Post on 01-Sep-2014

23.533 views

Category:

Technology


3 download

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

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