Slide 1

Slide 1 text

Exploding Rails

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Rails: “Ge2ng started is easy” True

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

Ac=ve Record is (mostly) to blame.

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Causes an N+1 query

Slide 14

Slide 14 text

Mixes database querying and data manipula=on

Slide 15

Slide 15 text

DB Calls Count: 3

Slide 16

Slide 16 text

“I’ll just stub those things out!”

Slide 17

Slide 17 text

No content

Slide 18

Slide 18 text

Fixes the N+1 issue

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

Causes an N+1 query, also

Slide 21

Slide 21 text

SQL Query A view New in Rails 5.2 Query logging

Slide 22

Slide 22 text

Ac=ve Record is an an+-paBern.

Slide 23

Slide 23 text

Causes an N+1 query, also

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Rails has barely evolved.

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

Slide 32

Slide 32 text

Have we learned nothing?

Slide 33

Slide 33 text

Rails as a delivery mechanism.

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

A browser Rails App Repos Database POROs Returns records

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

Returns data A browser Rails App Repos Database POROs

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

An En=ty

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

DB Calls Count: 0

Slide 46

Slide 46 text

My Rails App

Slide 47

Slide 47 text

Regular Rails App

Slide 48

Slide 48 text

My Rails App

Slide 49

Slide 49 text

Regular Rails App

Slide 50

Slide 50 text

How did I get to this magical utopia?

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

Schemas validate data for your applica=on.

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

A cleaner architecture.

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

Rails as a simple delivery mechanism.

Slide 62

Slide 62 text

I could go on…

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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