Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Exploding Rails

Ryan Bigg
April 24, 2018

Exploding Rails

Active Record causes numerous problems within a Rails application. I cover a few of these in the talk, and show an alternate way of approaching the same problems.

Ryan Bigg

April 24, 2018
Tweet

More Decks by Ryan Bigg

Other Decks in Technology

Transcript

  1. Exploding

    Rails

    View Slide

  2. Rails:
    “Ge2ng started is easy”
    True / False?

    View Slide

  3. Rails:
    “Ge2ng started is easy”
    True

    View Slide

  4. View Slide

  5. Rails:
    “Applica=on maintenance
    is a cinch.”
    True / False?

    View Slide

  6. View Slide

  7. Rails:
    “Applica=on maintenance
    is a cinch.”
    False

    View Slide

  8. Ge2ng started is a
    one +me cost.
    Maintenance is forever.

    View Slide

  9. Ac=ve Record
    is (mostly) to blame.

    View Slide

  10. View Slide

  11. View Slide

  12. “Look at all the things
    I’m not doing.”
    “Provide sharp knives.”

    View Slide

  13. Causes an N+1 query

    View Slide

  14. Mixes database querying
    and data manipula=on

    View Slide

  15. DB Calls Count: 3

    View Slide

  16. “I’ll just stub those
    things out!”

    View Slide

  17. View Slide

  18. Fixes the N+1 issue

    View Slide

  19. View Slide

  20. Causes an N+1 query, also

    View Slide

  21. SQL Query
    A view
    New in Rails 5.2
    Query logging

    View Slide

  22. Ac=ve Record
    is an an+-paBern.

    View Slide

  23. Causes an N+1 query, also

    View Slide

  24. View Slide

  25. Ac=ve Record
    violates SRP
    You, looking on in despair

    View Slide

  26. Ac=ve Record =es
    your applica=on
    to your database.

    View Slide

  27. Rails applica=ons know
    too much about their
    underlying database.
    (because Ac=ve Record makes it easy)

    View Slide

  28. Rails has
    barely evolved.

    View Slide

  29. Rails 1.2 Rails 5.2
    app
    /controllers
    /helpers
    /models
    /views
    app
    /controllers
    /helpers
    /mailers
    /models
    /views

    View Slide

  30. Does it go in the
    view?
    Does it go in the
    controller?
    Put it in the model
    No
    No

    View Slide


  31. View Slide

  32. Have we learned
    nothing?

    View Slide

  33. Rails as a
    delivery mechanism.

    View Slide

  34. A browser
    Rails App
    Repos
    Database
    Rails
    Ruby
    PostgreSQL
    (duh)
    POROs
    Knows nothing about

    View Slide

  35. Makes a
    request to…
    A browser
    Rails App
    Repos
    Database
    POROs

    View Slide

  36. A browser
    Rails App
    Repos
    Database
    POROs
    Makes a
    request to…

    View Slide

  37. A browser
    Rails App
    Repos
    Database
    POROs
    Makes a
    request to…

    View Slide

  38. A browser
    Rails App
    Repos
    Database
    POROs
    Returns
    records

    View Slide

  39. Returns en++es
    A browser
    Rails App
    Repos
    Database
    POROs

    View Slide

  40. Returns
    data
    A browser
    Rails App
    Repos
    Database
    POROs

    View Slide

  41. View Slide

  42. An En=ty

    View Slide

  43. Projects::Project.new
    # => 12 methods
    My Rails App

    View Slide

  44. Project.new
    # => 296 methods
    A Vanilla Rails App
    callbacks, dirty tracking, validations, etc.

    View Slide

  45. DB Calls Count: 0

    View Slide

  46. My Rails App

    View Slide

  47. Regular Rails App

    View Slide

  48. My Rails App

    View Slide

  49. Regular Rails App

    View Slide

  50. How did I get to this
    magical utopia?

    View Slide

  51. ROM!
    http://rom-rb.org/

    View Slide

  52. Exploded Rails
    app
    /controllers
    /helpers
    /models
    /relations
    /repositories
    /schemas
    /transactions
    /views
    Regular Rails 5.2
    app
    /controllers
    /helpers
    /mailers
    /models
    /views

    View Slide

  53. Repositories
    are the API
    between rela=ons and
    your applica=on.

    View Slide

  54. Rela=ons
    are the API
    between repositories
    and your database.

    View Slide

  55. Schemas
    validate data
    for your applica=on.

    View Slide

  56. Transac=ons
    wrap complicated
    ac=ons into sensible steps.

    View Slide

  57. A cleaner
    architecture.

    View Slide

  58. Rails controllers
    know nothing
    about the database.
    (They only know about the repositories)

    View Slide

  59. Rails views
    are unable to
    perform DB queries.
    (They accept what is given to them)

    View Slide

  60. Rails models
    represent data and
    do nothing else.
    (No callbacks. No validation.)

    View Slide

  61. Rails as a simple
    delivery mechanism.

    View Slide

  62. I could go on…

    View Slide

  63. Or you could read
    my app’s code:
    bit.ly/twist-v2
    Uses Hanami + React

    View Slide

  64. Or you could read
    my new book:
    bit.ly/exploding-rails
    $10 off
    Covers using rom-rb
    and dry-rb with Rails

    View Slide