DataMapper
i n   2 0   m i n
Matt
   Aimonetti             Me



irc:   m a t t e t t i
Consultant               Me
based in San Diego, CA
Blogs:
   http://merbist.com

   http://railsontherun.com
DataMapper
i n   2 0   m i n



                DM
                  =
      Object Relational Mapper
DataMapper                              ORM
i n   2 0       m i n

Databases
scalar values


                    da
      ...
DataMapper
i n   2 0    m i n



        SELECT *
        FROM Book
        WHERE price > 100.00
        ORDER BY title;

...
DataMapper
i n   2 0    m i n




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




            Pure R...
DataMapper
i n   2 0   m i n




Book.find( :all,
:conditions => [quot;price > ?quot;, 100.00],
:order      => quot;titleq...
DataMapper
i n   2 0   m i n




      DM is MORE THAN THAT
DataMapper                          identity map
i n   2 0     m i n

@parent = Parent.find_by_name(quot;Bobquot;)

@paren...
DataMapper
i n    2 0   m i n




      Does what ActiveRecord does
            but differently
DataMapper                       Data Objects
i n   2 0   m i n




                                                Copyri...
DataMapper               Lazy loading
                               +
i n   2 0   m i n
                        Strategic...
DataMapper                     Lazy loading + SEL
 i n   2 0    m i n




#first, #each, #count, #map...
DM only generates...
DataMapper          Lazy loading + SEL
i n   2 0   m i n


zoos = Zoo.all
zoos.each do |zoo|
  zoo.exhibits.map{|e| e.name...
DataMapper                  Lazy loading + SEL
 i n   2 0   m i n

SELECT * FROM quot;zoosquot;
SELECT * FROM quot;exhibit...
DataMapper                Lazy loading + SEL
 i n   2 0   m i n



SELECT quot;idquot;, quot;namequot; FROM quot;zoosquot;...
DataMapper                        Lazy load
i n   2 0   m i n



 DM doesn’t load all properties for each request

       ...
DataMapper                              Multiple Repos
          i n   2 0     m i n
                production:
         ...
DataMapper               Multiple Repos
i n   2 0   m i n




Article.copy(:default, :nightly_backup,
             :create...
DataMapper                   Multiple Repos
i n   2 0   m i n




Article.copy(:nightly_backup, :weekly_backup,
          ...
DataMapper                      Legacy Data
i n     2 0   m i n

 class Page
   include DataMapper::Resource

      proper...
DataMapper              Adapters
i n   2 0   m i n


Provide an interface between your
              models
              ...
DataMapper                 Adapters
i n    2 0   m i n

                 imap
              file system
            salesfo...
DataMapper                       Lazy Attributes
i n   2 0     m i n

            google video - http scraper
            ...
DataMapper                Lazy Attributes
i n   2 0   m i n


      Sales Force read-write
           DM adapter
         ...
DataMapper                 Migrations
i n   2 0   m i n



             automigrate
             autoupdate
              ...
DataMapper             Custom Types
i n   2 0   m i n



             Load / Dump
DataMapper                              Plugins
i n     2 0    m i n

                modular structure


      migration,...
DataMapper                                    Query::Path
 i n     2 0      m i n

             Find all people
          ...
DataMapper                                    Query::Path
 i n     2 0      m i n

             Find all people
          ...
DataMapper
i n   2 0      m i n

Credits
 people who helped with this presentation:

            dbussink, dkubb, afrench,...
Upcoming SlideShare
Loading in...5
×

DataMapper In 20 min

18,513

Published on

Overview of DataMapper and the differences between DM and other Ruby ORMs.

Presentation given by Matt Aimonetti during MerbCamp 2008 in San Diego, CA.

Published in: Technology, Business
2 Comments
21 Likes
Statistics
Notes
No Downloads
Views
Total Views
18,513
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
225
Comments
2
Likes
21
Embeds 0
No embeds

No notes for slide

DataMapper In 20 min

  1. 1. DataMapper i n 2 0 m i n
  2. 2. Matt Aimonetti Me irc: m a t t e t t i
  3. 3. Consultant Me based in San Diego, CA
  4. 4. Blogs: http://merbist.com http://railsontherun.com
  5. 5. DataMapper i n 2 0 m i n DM = Object Relational Mapper
  6. 6. DataMapper ORM i n 2 0 m i n Databases scalar values da ta objects Object Oriented Languages
  7. 7. DataMapper i n 2 0 m i n SELECT * FROM Book WHERE price > 100.00 ORDER BY title; Raw SQL statements FTL
  8. 8. DataMapper i n 2 0 m i n Book.all( :price.gt => 100.00, :order => [:title.asc] ) Pure Ruby FTW
  9. 9. DataMapper i n 2 0 m i n Book.find( :all, :conditions => [quot;price > ?quot;, 100.00], :order => quot;titlequot; ) ¿SQL/Ruby FAIL?
  10. 10. DataMapper i n 2 0 m i n DM is MORE THAN THAT
  11. 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. 12. DataMapper i n 2 0 m i n Does what ActiveRecord does but differently
  13. 13. DataMapper Data Objects i n 2 0 m i n Copyright - Merb in Action - Manning db drivers using 1 unified interface
  14. 14. DataMapper Lazy loading + i n 2 0 m i n Strategic Eager Loader Procrastination becomes an ORM value
  15. 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. 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. 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. 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. 19. DataMapper Lazy load i n 2 0 m i n DM doesn’t load all properties for each request unless required
  20. 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. 21. DataMapper Multiple Repos i n 2 0 m i n Article.copy(:default, :nightly_backup, :created.gt => 1.day.ago )
  22. 22. DataMapper Multiple Repos i n 2 0 m i n Article.copy(:nightly_backup, :weekly_backup, :created.gt => 1.week.ago )
  23. 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. 24. DataMapper Adapters i n 2 0 m i n Provide an interface between your models and a data store.
  25. 25. DataMapper Adapters i n 2 0 m i n imap file system salesforce API REST couchdb ferret google video - http scraper
  26. 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. 27. DataMapper Lazy Attributes i n 2 0 m i n Sales Force read-write DM adapter 200 LOC
  28. 28. DataMapper Migrations i n 2 0 m i n automigrate autoupdate migration
  29. 29. DataMapper Custom Types i n 2 0 m i n Load / Dump
  30. 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. 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. 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. 33. DataMapper i n 2 0 m i n Credits people who helped with this presentation: dbussink, dkubb, afrench, wycats
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×