DataMapper

 DataMapper

Presentation introducing DataMapper given at the RubyArgentina Meetup, 13 May 2011. (Based on a presentation by Dirkjan Bussink given at RubyEnRails Amsterdam 2009).

9b1a71682de14fc6fc2b944a9c4814a0?s=128

Alex Coles

March 31, 2012
Tweet

Transcript

  1. RubyArgentina Meetup 13 mayo 2011, Buenos Aires Sonntag, 1. April

    12
  2. Hola, soy Alex github.com/myabc twitter.com/myabc alexbcoles.com Sonntag, 1. April 12

  3. Qué hago? Sonntag, 1. April 12

  4. Sonntag, 1. April 12

  5. Un ORM Sonntag, 1. April 12

  6. o no? Sonntag, 1. April 12

  7. o no? un ODM Sonntag, 1. April 12

  8. o no? un ODM persistence Sonntag, 1. April 12

  9. 1.8 1.9 Windows JRuby Rubinius Sonntag, 1. April 12

  10. Sonntag, 1. April 12

  11. DataMapper Básicos Sonntag, 1. April 12

  12. class  Person    include  DataMapper::Resource    property  :id,    

     Serial    property  :name,  String    property  :age,    Integer end Sonntag, 1. April 12
  13. DataMapper.auto_migrate! DataMapper.auto_upgrade! Sonntag, 1. April 12

  14. Sonntag, 1. April 12

  15. class  Person    ...    property  :name,  String,  :length  =>

     512    ... end Sonntag, 1. April 12
  16. Ruby! Person.all(:name.like  =>  "%me%") Sonntag, 1. April 12

  17. Mapa de identidad repository  do    puts  Person.get(1).object_id  =>  2232427080

       puts  Person.get(1).object_id  =>  2232427080 end Sonntag, 1. April 12
  18. Soporta plugins para mapas de identidad Sonntag, 1. April 12

  19. http://www.flickr.com/photos/mattimattila Sonntag, 1. April 12

  20. Fiaca Sonntag, 1. April 12

  21. people  =  Person.all(:name.like  =>  "%me%") ~  Query  log  empty... p

     people ~  SELECT  "id",  "name"  FROM  people Sonntag, 1. April 12
  22. :each Kicker Sonntag, 1. April 12

  23. Carga por adelantado people  =  Person.all people.each  do  |person|  

     p  person.addresses end SELECT  "id",  "name"  FROM  people; SELECT  "id",  "street"  FROM  addresses  WHERE  ("person_id"  IN  (1,2,3)) Sonntag, 1. April 12
  24. RDBMS IMAP YAML Sonntag, 1. April 12

  25. Repositorios múltiples DataMapper.setup(:repo1,  "postgres://postgres@localhost/dm") DataMapper.setup(:repo2,  "mysql://root@localhost/dm") repository(:repo1)  do    p

     Person.get(1)  =>  #<Person  @id=1  @name="Piotr"  @age=20> end repository(:repo2)  do    p  Person.get(1)  =>  #<Person  @id=1  @name="José"  @age=12> end Sonntag, 1. April 12
  26. DataMapper.setup(:repo1, "postgres://postgres@localhost/dm") DataMapper.setup(:repo2, "mysql://root@localhost/dm") get "/" do # Odd /

    even sharding repo = "repo#{user.id % 2 + 1}".to_sym repository(repo) do @people = Person.all end erb :people end Sharding simple Sonntag, 1. April 12
  27. module  DataMapper    module  Adapters        class  MyStorageAdapter

     <  AbstractAdapter            def  create(resources)            end            def  read(query)            end            def  update(attributes,  collection)            end            def  delete(collection)            end        end    end end Sonntag, 1. April 12
  28. Person.all(:name.like  =>  'dirk%').update!(:age  =>  28) Person.all.destroy!(:age.gte  =>  100) Actualizaciones en

    bloque Sonntag, 1. April 12
  29. Cuando los términos de búsqueda simples no son su cientes...

    Sonntag, 1. April 12
  30. términos de búsqueda complejos! Person.all(Person.addresses.street.like  =>  "%street%")      

     SELECT  "people"."id",  "people"."name",  "people"."age"  FROM  "people" INNER  JOIN  "addresses"  ON  "people"."id"  =  "addresses"."person_id"          WHERE  "addresses"."street"  LIKE  '%street%'    GROUP  BY  "people"."id",  "people"."name",  "people"."age"    ORDER  BY  "people"."id" Sonntag, 1. April 12
  31. class Person include DataMapper::Resource property :id, Serial property :name, String

    property :age, Integer has n, :addresses def self.named_like_me all(:name.like => "%me%") end def self.older_than_me all(:age.gt => 27) end end Person.named_like_me.older_than_me ~ SELECT "id", "name", "age" FROM "people" WHERE ("name" LIKE '%me%' AND "age" > 27) ORDER BY "id" Encadenamiento de términos de búsqueda Sonntag, 1. April 12
  32. class Person include DataMapper::Resource property :id, Serial property :name, String

    property :age, Integer has n, :addresses def self.named_like_me all(:name.like => "%me%") end def self.older_than_me all(:age.gt => 27) end end Person.named_like_me.older_than_me ~ SELECT "id", "name", "age" FROM "people" WHERE ("name" LIKE '%me%' AND "age" > 27) ORDER BY "id" Encadenamiento de términos de búsqueda Alcances nominales en simple Ruby Sonntag, 1. April 12
  33. Subtérminos de búsqueda Person.all(:name.like  =>  '%me%').addresses.all(:street.not  =>  nil) SELECT  "id",

     "street",  "person_id"  FROM  "addresses"    WHERE  (                "person_id"  IN  (SELECT  "id"  FROM  "people"  WHERE  "name"  LIKE  '%me%')                  AND  "street"  IS  NOT  NULL  )  ORDER  BY  "id" Sonntag, 1. April 12
  34. Sonntag, 1. April 12

  35. Person.all  -­‐  Person.all(:name  =>  'Dan  Kubb') SELECT  *  FROM  people

     WHERE  NOT(name  =  'Dan  Kubb') Sonntag, 1. April 12
  36. [1,  2]  &  [2,  3]  ==  [2] [1,  2]  |

     [2,  3]  ==  [1,  2,  3] Sonntag, 1. April 12
  37. Plugins Sonntag, 1. April 12

  38. Validaciones automáticas class  Person    ...    property  :name,  String,

     :nullable  =>  false end CREATE  TABLE  "people"  ("id"  SERIAL  NOT  NULL,                                                "name"  VARCHAR(50)  NOT  NULL,                                              "age"  INTEGER,  PRIMARY  KEY("id")) Sonntag, 1. April 12
  39. DataObjects::IntegrityError:  ERROR:     null  value  in  column  "name"  violates

     not-­‐null   constraint Person.create Sonntag, 1. April 12
  40. person  =  Person.create p  person.errors  =>  #<DataMapper::Validate::ValidationErrors:0x101d217a0      

                                         @errors={:name=>["Name  must  not  be  blank"]},                                          @resource=#<Person  @id=nil  @name=nil  @age=nil>> Sonntag, 1. April 12
  41. Validaciones class  Person    ...     validates_presence_of  :name end

    Sonntag, 1. April 12
  42. Sello de tiempo class  Person    ...    property  :created_at,

     DateTime    property  :updated_at,  DateTime end Sonntag, 1. April 12
  43. Precisar Person.all.adjust!(:age  =>  1) Sonntag, 1. April 12

  44. Restricciones class  Person    ...    has  n,  :addresses,  :constraint

     =>  :destroy! end ALTER  TABLE  addresses ADD  CONSTRAINT  addresses_person_id_fk FOREIGN  KEY  (person_id) REFERENCES  people ON  DELETE  CASCADE ON  UPDATE  CASCADE Sonntag, 1. April 12
  45. module  DataMapper    module  Types        class  IPAddress

     <  DataMapper::Type            primitive  String            length        16            def  self.load(value,  property)                IPAddr.new(value)            end            def  self.dump(value,  property)                value.to_s            end            def  self.typecast(value,  property)                value.kind_of?(IPAddr)  ?  value  :  load(value,  property)            end        end    end end class  NetworkNode    ...    property  :ipaddress,  IPAddress end Tipos personalizables Sonntag, 1. April 12
  46. class  Address    include  DataMapper::EmbeddedValue    property  :street,    

           String end class  Person    include  DataMapper::Resource    property  :id,            Serial    property  :name,        String    has  n,  :addresses end Sonntag, 1. April 12
  47. Términos de búsqueda estilo Ambition User.select  {  |u|  u.id  ==

     1  &&  u.name  ==  'Dan  Kubb'  } Sonntag, 1. April 12
  48. 1.1.x Mapa de ruta • Resolver la mayoría de los

    bugs • Arreglar problemas con uniones (joins) complejas • Soporte para validaciones i18n • Encontrar un método conveniente para detectar (typecasting) valores en blanco para nils en dm- rails • Finalizar el soporte para propiedades binarias (que deberían mapear a BLOB, BYTEA, etc.) Sonntag, 1. April 12
  49. 1.2 Mapa de ruta • Propriedad API nalizada • EmbeddedValue

    • Hooks mejorados • Soporte de uniones (joins) explícitos • Soportar comando ordenar en asociaciones • Soporte de restricciones utilizando sqlite3 Sonntag, 1. April 12
  50. EmbeddedValue qué vendrá en 1.2 class  Person    include  Address

       property  :id,            Serial end class  Address    include  DataMapper::EmbeddedValue end Sonntag, 1. April 12
  51. 2.0 Mapa de ruta • Basado en patrones DataMapper verdaderos

    • Integración con Veritas Sonntag, 1. April 12
  52. github.com/devver/dm-adapter-simpledb github.com/solnic/dm-mongo-adapter Sonntag, 1. April 12

  53. github.com/datamapper datamapper.org/ groups.google.com/group/datamapper irc://irc.freenode.net/#datamapper Sonntag, 1. April 12

  54. Preguntas, dudas? Sonntag, 1. April 12

  55. Dirkjan Bussink github.com/dbusssink @dbussink gracias a Piotr Solnica github.com/solnic @_solnic_

    solnic.eu Sonntag, 1. April 12
  56. Dan Kubb gracias a github.com/dkubb @dkubb Sonntag, 1. April 12