$30 off During Our Annual Pro Sale. View Details »

rom 4.0 is coming

rom 4.0 is coming

Piotr Solnica

July 09, 2017
Tweet

More Decks by Piotr Solnica

Other Decks in Programming

Transcript

  1. ROM-RB 4.0 IS COMING
    PIOTR SOLNICA >> BRIGHTON RUBY 2017
    1

    View Slide

  2. PIOTR SOLNICA
    > ! Cracow, Poland
    > github.com/solnic
    > @_solnic_
    > solnic.eu
    2

    View Slide

  3. TECH LEAD AT ICELAB
    3

    View Slide

  4. WHAT'S ROM-RB?
    4

    View Slide

  5. an open-source persistence and
    mapping toolkit for Ruby built for
    speed and simplicity
    5

    View Slide

  6. DATABASE-AGNOSTIC, FLEXIBLE,
    EXTENDIBLE, FAST, SIMPLE
    6

    View Slide

  7. FOR REAL !
    7

    View Slide

  8. SOUNDS LIKE SOME
    CRAZY
    OBJECT RELATIONAL
    MAPPER, EH?
    8

    View Slide

  9. ROM
    IS NOT
    AN ORM
    9

    View Slide

  10. WHY DOES IT EVEN EXIST?
    10

    View Slide

  11. A TRUE ALTERNATIVE TO ACTIVE RECORD
    11

    View Slide

  12. ROM-RB PROVIDES A WAY TO
    SEPARATE PERSISTENCE CONCERNS
    FROM APPLICATION DOMAIN
    12

    View Slide

  13. WHAT'S THE
    DEAL WITH 4.0?
    13

    View Slide

  14. RUBYISTS LOVE MAGIC
    ˾(✿˙ᗜ˙)੭ʓ̤ꚍ.*ꙓꙏꚍ
    14

    View Slide

  15. MAGIC
    AKA: IMPLICIT CODE
    AKA: EASY TO USE ABSTRACTIONS
    15

    View Slide

  16. ACTIVERECORD
    POSSIBLY THE MOST MAGICAL GEM IN THE UNIVERSE
    16

    View Slide

  17. NO BOILERPLATE
    class User < ActiveRecord::Base
    end
    17

    View Slide

  18. PERSISTENCE, SO SIMPLE
    user = User.create(name: "Jane")
    18

    View Slide

  19. QUERIES, SO SIMPLE
    User.where(name: "Jane").first
    19

    View Slide

  20. MAKING CHANGES, SO SIMPLE
    User.where(name: "Jane").update_all(name: "Jane Doe")
    20

    View Slide

  21. EASE OF USE
    > Little code to write to get started
    > A lot of functionality OOTB
    > No boilerplate
    21

    View Slide

  22. THIS IS A REAL CHALLENGE FOR ROM-RB!
    22

    View Slide

  23. > Dynamic query interface
    > Explicit representation of data structures
    > Mapping to struct objects decoupled from the database
    > No concept of lazy-loadable associations
    23

    View Slide

  24. THIS IS FINE
    24

    View Slide

  25. WE MADE IT
    (⊃ꙏ•́‿•̀ꙏ)⊃━☆ꚍ.*ꙓꙏꚍ
    25

    View Slide

  26. RELATIONS AND STRUCTS
    26

    View Slide

  27. class Users < ROM::Relation[:sql]
    schema(infer: true)
    end
    27

    View Slide

  28. ✅ NO BOILERPLATE
    28

    View Slide

  29. users.changeset(:create, name: "Jane").commit
    # => #
    29

    View Slide

  30. ✅ PERSISTENCE, SO SIMPLE
    30

    View Slide

  31. users.where(name: "Jane").first
    # => #
    31

    View Slide

  32. ✅ QUERIES, SO SIMPLE
    32

    View Slide

  33. users.where(name: "Jane").changeset(:update, name: "Jane Doe").commit
    # => #
    33

    View Slide

  34. ✅ MAKING CHANGES, SO SIMPLE
    34

    View Slide

  35. BUT...
    35

    View Slide

  36. users.first
    # => #
    users.select(:name).first
    # => #
    36

    View Slide

  37. PEOPLE WANT THEIR OWN METHODS, OBVIOUSLY
    37

    View Slide

  38. class User < ActiveRecord::Base
    def first_name
    name.split(' ').first
    end
    def last_name
    name.split(' ').last
    end
    end
    38

    View Slide

  39. ROM-RB: CUSTOM STRUCT NAMESPACE
    39

    View Slide

  40. class Users < ROM::Relation[:sql]
    struct_namespace Entities
    schema(infer: true)
    end
    40

    View Slide

  41. class Users < ROM::Relation[:sql]
    struct_namespace Entities
    schema(infer: true)
    end
    41

    View Slide

  42. module Entities
    class User < ROM::Struct
    def first_name
    name.split(' ').first
    end
    def last_name
    name.split(' ').last
    end
    end
    end
    42

    View Slide

  43. module Entities
    class User < ROM::Struct
    def first_name
    name.split(' ').first
    end
    def last_name
    name.split(' ').last
    end
    end
    end
    43

    View Slide

  44. user = users.first
    => #
    user.first_name
    # "Jane"
    user.last_name
    # "Doe"
    44

    View Slide

  45. user = users.select(:name).first
    => #
    user.first_name
    # "Jane"
    user.last_name
    # "Doe"
    45

    View Slide

  46. WHAT DOES THIS MEAN, REALLY? !
    46

    View Slide

  47. THE TRUTH
    ABOUT MAGIC
    47

    View Slide

  48. EXCITEMENT ABOUT MAGIC (AKA HAPPINESS)
    48

    View Slide

  49. ROM-RB DOESN'T ENFORCE MAGIC!
    49

    View Slide

  50. AT ANY POINT IN TIME
    YOU CAN DEFINE STRUCTS
    WITH EXPLICIT ATTRIBUTES
    AND ASK ROM-RB TO LOAD THEM
    50

    View Slide

  51. require "entities/address"
    module Entities
    class UserProfile < ROM::Struct
    attribute :email, Types::Strict::String
    attribute :name, Types::Strict::String
    attribute :age, Types::Strict::Integer
    attribute :address, Address
    end
    end
    51

    View Slide

  52. users.combine(:address).as(:user_profile).first
    52

    View Slide

  53. HOWEVER...THIS REQUIRES TIME,
    AND GOOD UNDERSTANDING OF THE APPLICATION DOMAIN!
    53

    View Slide

  54. IT'S A PROCESS, AND ROM-RB FULLY SUPPORTS IT
    54

    View Slide

  55. 4.0.0.BETA
    WAS RELEASED A COUPLE
    WEEKS AGO !
    (JUST SAYING!)
    55

    View Slide

  56. THANK YOU !
    ! GITHUB.COM/ROM-RB/ROM
    56

    View Slide