Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
rom 4.0 is coming
Search
Piotr Solnica
July 09, 2017
Programming
940
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
rom 4.0 is coming
Piotr Solnica
July 09, 2017
More Decks by Piotr Solnica
See All by Piotr Solnica
[KRUG] Architecture. The reclaimed years.
solnic
2
550
rom-rb 4.0 - Moscow, RailsClub 2017
solnic
3
1.4k
Blending Functional and OO programming in Ruby
solnic
22
2.5k
Deep Dive Into ROM
solnic
7
1.3k
Clean Code Cowboy
solnic
4
1.1k
Convenience vs Simplicity
solnic
4
2k
Micro Libraries FTW
solnic
2
700
DataMapper 2 - an object mapping toolkit
solnic
6
1.1k
Beyond the ORM - RuLu Conf 2012
solnic
1
1.6k
Other Decks in Programming
See All in Programming
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
190
Security issues being discussed on Web Platforms
petamoriken
0
1.2k
技術的負債の返済は、AI時代の複利で効く投資 — 経営としての意思決定とその遂行
curekoshimizu
0
1.8k
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
180
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.1k
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
390
Heart of Swift Concurrency
koher
0
960
AWSに止められる覚悟してますか?
morizo_1984
0
100
ゲームコントローラやキーボードのファームウェアをSwiftで書く
kishikawakatsumi
1
250
Vue Fes Japan 2026 タイムテーブル徹底解説
448jp
1
510
Intent as Code
shoppingjaws
6
1.1k
モバイル交通系ICへのチャージ実例から考える、クロスプラットフォーム開発におけるiOS実機テスト設計とCI運用
yusuga
1
540
Featured
See All Featured
Java REST API Framework Comparison - PWX 2021
mraible
34
9.7k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
530
Six Lessons from altMBA
skipperchong
29
4.5k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
550
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
380
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
290
Between Models and Reality
mayunak
4
460
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Transcript
ROM-RB 4.0 IS COMING PIOTR SOLNICA >> BRIGHTON RUBY 2017
1
PIOTR SOLNICA > ! Cracow, Poland > github.com/solnic > @_solnic_
> solnic.eu 2
TECH LEAD AT ICELAB 3
WHAT'S ROM-RB? 4
an open-source persistence and mapping toolkit for Ruby built for
speed and simplicity 5
DATABASE-AGNOSTIC, FLEXIBLE, EXTENDIBLE, FAST, SIMPLE 6
FOR REAL ! 7
SOUNDS LIKE SOME CRAZY OBJECT RELATIONAL MAPPER, EH? 8
ROM IS NOT AN ORM 9
WHY DOES IT EVEN EXIST? 10
A TRUE ALTERNATIVE TO ACTIVE RECORD 11
ROM-RB PROVIDES A WAY TO SEPARATE PERSISTENCE CONCERNS FROM APPLICATION
DOMAIN 12
WHAT'S THE DEAL WITH 4.0? 13
RUBYISTS LOVE MAGIC ˾(✿˙ᗜ˙)੭ʓ̤ꚍ.*ꙓꙏꚍ 14
MAGIC AKA: IMPLICIT CODE AKA: EASY TO USE ABSTRACTIONS 15
ACTIVERECORD POSSIBLY THE MOST MAGICAL GEM IN THE UNIVERSE 16
NO BOILERPLATE class User < ActiveRecord::Base end 17
PERSISTENCE, SO SIMPLE user = User.create(name: "Jane") 18
QUERIES, SO SIMPLE User.where(name: "Jane").first 19
MAKING CHANGES, SO SIMPLE User.where(name: "Jane").update_all(name: "Jane Doe") 20
EASE OF USE > Little code to write to get
started > A lot of functionality OOTB > No boilerplate 21
THIS IS A REAL CHALLENGE FOR ROM-RB! 22
> Dynamic query interface > Explicit representation of data structures
> Mapping to struct objects decoupled from the database > No concept of lazy-loadable associations 23
THIS IS FINE 24
WE MADE IT (⊃ꙏ•́‿•̀ꙏ)⊃━☆ꚍ.*ꙓꙏꚍ 25
RELATIONS AND STRUCTS 26
class Users < ROM::Relation[:sql] schema(infer: true) end 27
✅ NO BOILERPLATE 28
users.changeset(:create, name: "Jane").commit # => #<ROM::Struct::User id=1 name="Jane"> 29
✅ PERSISTENCE, SO SIMPLE 30
users.where(name: "Jane").first # => #<ROM::Struct::User id=1 name="Jane"> 31
✅ QUERIES, SO SIMPLE 32
users.where(name: "Jane").changeset(:update, name: "Jane Doe").commit # => #<ROM::Struct::User id=1 name="Jane
Doe"> 33
✅ MAKING CHANGES, SO SIMPLE 34
BUT... 35
users.first # => #<ROM::Struct::User id=1 name="Jane"> users.select(:name).first # => #<ROM::Struct::User
name="Jane"> 36
PEOPLE WANT THEIR OWN METHODS, OBVIOUSLY 37
class User < ActiveRecord::Base def first_name name.split(' ').first end def
last_name name.split(' ').last end end 38
ROM-RB: CUSTOM STRUCT NAMESPACE 39
class Users < ROM::Relation[:sql] struct_namespace Entities schema(infer: true) end 40
class Users < ROM::Relation[:sql] struct_namespace Entities schema(infer: true) end 41
module Entities class User < ROM::Struct def first_name name.split(' ').first
end def last_name name.split(' ').last end end end 42
module Entities class User < ROM::Struct def first_name name.split(' ').first
end def last_name name.split(' ').last end end end 43
user = users.first => #<Entities::User id=1 name="Jane Doe"> user.first_name #
"Jane" user.last_name # "Doe" 44
user = users.select(:name).first => #<Entities::User name="Jane Doe"> user.first_name # "Jane"
user.last_name # "Doe" 45
WHAT DOES THIS MEAN, REALLY? ! 46
THE TRUTH ABOUT MAGIC 47
EXCITEMENT ABOUT MAGIC (AKA HAPPINESS) 48
ROM-RB DOESN'T ENFORCE MAGIC! 49
AT ANY POINT IN TIME YOU CAN DEFINE STRUCTS WITH
EXPLICIT ATTRIBUTES AND ASK ROM-RB TO LOAD THEM 50
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
users.combine(:address).as(:user_profile).first 52
HOWEVER...THIS REQUIRES TIME, AND GOOD UNDERSTANDING OF THE APPLICATION DOMAIN!
53
IT'S A PROCESS, AND ROM-RB FULLY SUPPORTS IT 54
4.0.0.BETA WAS RELEASED A COUPLE WEEKS AGO ! (JUST SAYING!)
55
THANK YOU ! ! GITHUB.COM/ROM-RB/ROM 56