Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rails Pacific - Multitenancy with Rails
Search
Ryan Bigg
October 25, 2014
Programming
300
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rails Pacific - Multitenancy with Rails
Covers the lessons learned about Multitenancy with Rails in the process of writing my book.
Ryan Bigg
October 25, 2014
More Decks by Ryan Bigg
See All by Ryan Bigg
Hiring Juniors - RubyConf Indonesia 2019 Closing Keynote
radar
1
460
Web Directions - Code Leaders - Hiring Juniors
radar
0
700
The Future of Rails - Take 2
radar
0
150
The Future of Rails
radar
1
170
Exploding Rails
radar
9
1.9k
Hiring Juniors
radar
2
480
The Perfect Coding Test
radar
0
150
Your First Developer Job
radar
1
120
Hiring Juniors
radar
2
300
Other Decks in Programming
See All in Programming
act1-costs.pdf
sumedhbala
0
210
共通化で考えるべきは、実装より公開する型だった
codeegg
0
190
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
440
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
180
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
220
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
270
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
210
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
460
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
トークンをケチるな、設計しろ:GitHub Copilotを賢く使うコンテキスト戦略
ochtum
0
310
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
830
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
170
Featured
See All Featured
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
Paper Plane
katiecoart
PRO
2
52k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
330
Prompt Engineering for Job Search
mfonobong
0
370
Abbi's Birthday
coloredviolet
3
8.6k
Building Applications with DynamoDB
mza
96
7.1k
The Curse of the Amulet
leimatthew05
2
13k
Paper Plane (Part 1)
katiecoart
PRO
0
9.5k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Producing Creativity
orderedlist
PRO
348
40k
Transcript
lifx.co
#21 Not #21
Multitenancy with Rails Ryan Bigg
None
None
Multitenancy?
None
None
None
Organization Team Repos
User Repos
None
…
DOGLIFEBETA! Garçon Fluffy Brutus “Like Facebook, but for dogs”
Multitenancy with Rails?
None
Is it… ✔ well maintained ✔ well documented ✔ clean
code
acts_as_tenant ✔ well documented
acts_as_tenant ✔ well maintained ✔ 140 commits, 19 contributors, low
issue count ✔ CI on Travis
acts_as_tenant ✔ clean code
acts_as_tenant
RequestStore.store
None
Thread.current Thread.current
apartment ✔ well documented ✔ well maintained ✔ clean code
“If you are using PostgreSQL, Apartment by default will set
up a new schema and migrate into there.”
“If you are using PostgreSQL, Apartment by default will set
up a new schema and migrate into there.”
None
“A database contains one or more named schemas, which in
turn contain tables.” “There are several reasons why one might want to use schemas: * To allow many users to use one database without interfering with each other.”
“To allow many users to use one database without interfering
with each other.”
ryanbigg=# SHOW search_path; search_path ---------------- "$user",public (1 row) "$user",public
fluffy.doglife.com garcon.doglife.com DOGLIFE BETA! brutus.doglife.com 1 2 3
(1.4ms) CREATE SCHEMA "garcon" <more tables go here>
None
None
None
DEPLOY IT!
Heroku Postgres
Backup time 24 hours
PostgreSQL is great
PostgreSQL with too many schemas
Part 2: Schema-less Multitenancy
Apartment
None
TEST ALL THE TIME
TEST ALL THE TIME?
TEST ALL THE TIME
Are you testing right now? No?
TEST ALL THE TIME OR ELSE
A codebase without tests
fluffy.doglife.com Fluffy’s Posts current_account = Fluffy @posts = current_account.posts fluffy.doglife.com/posts
Feature #1: Viewing Posts
A guest on Account A’s subdomain should only see Account
A’s posts Expected to not see “<Account B’s post>” Feature #1: Viewing Posts
Feature #1: Viewing Posts
Feature #1: Viewing Posts
Feature #1: Viewing Posts
A guest on Account A’s subdomain should only see Account
A’s posts Feature #1: Viewing Posts
fluffy.doglife.com Fluffy’s Posts current_account = Fluffy @posts = current_account.posts fluffy.doglife.com/posts
Feature #1: Viewing Posts
fluffy.doglife.com Fluffy’s Albums current_account = Fluffy @albums = current_account.albums fluffy.doglife.com/albums
Fluffy’s First Birthday Pictures @pictures = @album.pictures fluffy.doglife.com/albums/1/pictures Feature #2: Viewing Pictures
A guest on Account A’s subdomain should only see Account
A’s albums Expected to not see “<Account B’s album>” Feature #2: Viewing Pictures
Feature #2: Viewing Pictures
Feature #2: Viewing Pictures
A guest on Account A’s subdomain should only see Account
A’s albums Feature #2: Viewing Pictures
A guest on Account A’s subdomain viewing an album shows
pictures from that album Expected to not see “<Account B’s picture>” Feature #2: Viewing Pictures
Feature #2: Viewing Pictures
Feature #2: Viewing Pictures
A guest on Account A’s subdomain viewing an album shows
pictures from that album Feature #2: Viewing Pictures
fluffy.doglife.com Fluffy’s Albums current_account = Fluffy @albums = current_account.albums fluffy.doglife.com/albums
Fluffy’s First Birthday Pictures @pictures = @album.pictures fluffy.doglife.com/albums/1/pictures Feature #2: Viewing Pictures
Feature #2: Viewing Pictures
REGRESSION TEST ALL THE TIME
Feature #2: Viewing Pictures
None
Part 3: Subscriptions
None
doglife.com/sign_up plan = Basic ($9.99) Feature #3: User subscribes to
a plan ???
“Writing code to manage subscriptions is easy.” - nobody, ever
Your subscriptions code
PayPal
None
PayPal
None
“Stripe makes recurring and subscription-based billing easy.”
None
None
None
:CreateRecurringPaymentsProfileRequestDetails PayPal
None
“My company makes your life easy.”
doglife.com/sign_up plan = Basic ($9.99) Feature #3: User subscribes to
a plan
None
[email protected]
[email protected]
⁉
[email protected]
leanpub.com/multi-tenancy-rails/c/railspacific $10 off