11. DataMapper identity map
i n 2 0 m i n
@parent = Parent.find_by_name(quot;Bobquot;)
@parent.children.each do |child|
@parent.object_id.should == child.parent.object_id
end
FAILS with ActiveRecord
PASSES with DataMapper
12. DataMapper
i n 2 0 m i n
Does what ActiveRecord does
but differently
13. DataMapper Data Objects
i n 2 0 m i n
Copyright - Merb in Action - Manning
db drivers using 1 unified interface
14. DataMapper Lazy loading
+
i n 2 0 m i n
Strategic Eager
Loader
Procrastination
becomes an
ORM value
15. DataMapper Lazy loading + SEL
i n 2 0 m i n
#first, #each, #count, #map...
DM only generates a query when encountering a kicker
16. DataMapper Lazy loading + SEL
i n 2 0 m i n
zoos = Zoo.all
zoos.each do |zoo|
zoo.exhibits.map{|e| e.name}
end
17. DataMapper Lazy loading + SEL
i n 2 0 m i n
SELECT * FROM quot;zoosquot;
SELECT * FROM quot;exhibitsquot; WHERE
(quot;exhibitsquot;.zoo_id = 1)
SELECT * FROM quot;exhibitsquot; WHERE
(quot;exhibitsquot;.zoo_id = 2)
SELECT * FROM quot;exhibitsquot; WHERE
(quot;exhibitsquot;.zoo_id = 3)
4 requests
ActiveRecord
18. DataMapper Lazy loading + SEL
i n 2 0 m i n
SELECT quot;idquot;, quot;namequot; FROM quot;zoosquot; ORDER BY quot;idquot;
SELECT quot;idquot;, quot;namequot;, quot;zoo_idquot; FROM quot;exhibitsquot;
WHERE (quot;zoo_idquot; IN (1, 3, 2)) ORDER BY quot;idquot;
2 requests
DataMapper
19. DataMapper Lazy load
i n 2 0 m i n
DM doesn’t load all properties for each request
unless required
20. DataMapper Multiple Repos
i n 2 0 m i n
production:
adapter: mysql
encoding: utf8
database: production-app
username: root
database.yml
password: top-s3ckit
host: localhost
repositories:
nightly_backup:
adapter: sqlite3
database: shared/nightly.db
weekly_backup:
adapter: sqlite3
database: shared/weekly.db
21. DataMapper Multiple Repos
i n 2 0 m i n
Article.copy(:default, :nightly_backup,
:created.gt => 1.day.ago )
22. DataMapper Multiple Repos
i n 2 0 m i n
Article.copy(:nightly_backup, :weekly_backup,
:created.gt => 1.week.ago )
23. DataMapper Legacy Data
i n 2 0 m i n
class Page
include DataMapper::Resource
property :id, Serial
property :name, String
repository(:legacy) do
property :name, String,
:field => quot;titlequot;
end
24. DataMapper Adapters
i n 2 0 m i n
Provide an interface between your
models
and
a data store.
25. DataMapper Adapters
i n 2 0 m i n
imap
file system
salesforce API
REST
couchdb
ferret
google video - http scraper
26. DataMapper Lazy Attributes
i n 2 0 m i n
google video - http scraper
DM adapter
80 LOC
only required to implement
- a read method
- handling query conditions
27. DataMapper Lazy Attributes
i n 2 0 m i n
Sales Force read-write
DM adapter
200 LOC
28. DataMapper Migrations
i n 2 0 m i n
automigrate
autoupdate
migration
29. DataMapper Custom Types
i n 2 0 m i n
Load / Dump
30. DataMapper Plugins
i n 2 0 m i n
modular structure
migration, validation, model factory, state
machine, constraints, lists, tagging...
DM facilitates extensions by offering nice hooks
31. DataMapper Query::Path
i n 2 0 m i n
Find all people
with an address that
has street in the street name
Person.all(Person.addresses.street.like =>
quot;%street%quot; )
SELECT quot;peoplequot;.quot;idquot;, quot;peoplequot;.quot;namequot; FROM quot;peoplequot;
INNER JOIN quot;addressesquot; ON (quot;peoplequot;.quot;idquot; = quot;addressesquot;.quot;person_idquot;)
WHERE (quot;addressesquot;.quot;streetquot; LIKE '%street%')
ORDER BY quot;peoplequot;.quot;idquot;
32. DataMapper Query::Path
i n 2 0 m i n
Find all people
with an address that
has street in the street name
Person.all(quot;addresses.street.likequot; =>
quot;%street%quot; )
SELECT quot;peoplequot;.quot;idquot;, quot;peoplequot;.quot;namequot; FROM quot;peoplequot;
INNER JOIN quot;addressesquot; ON (quot;peoplequot;.quot;idquot; = quot;addressesquot;.quot;person_idquot;)
WHERE (quot;addressesquot;.quot;streetquot; LIKE '%street%')
ORDER BY quot;peoplequot;.quot;idquot;
33. DataMapper
i n 2 0 m i n
Credits
people who helped with this presentation:
dbussink, dkubb, afrench, wycats