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
N+1 問題の解決と computed_model
Search
gedorinku
October 05, 2023
Programming
0
31
N+1 問題の解決と computed_model
gedorinku
October 05, 2023
Tweet
Share
More Decks by gedorinku
See All by gedorinku
Wantedly のバックエンドの将来に向けた取り組みと課題 - Wantedly Tech Night 2024/5
gedorinku
0
48
Porting mruby/c for the SNES (Super Famicom) - RubyKaigi 2024
gedorinku
0
3.4k
部内での競プロ用ジャッジシステム
gedorinku
0
1.6k
部内ジャッジを作る話
gedorinku
1
86
プロラボ年度末報告会 HackDay / Hack U 福岡
gedorinku
0
150
Kotlin入門しました
gedorinku
0
260
Other Decks in Programming
See All in Programming
急速に利用拡大を続ける飲食店向けサービスで 店内端末同士のローカル通信を追加設定なしで実現した話
whatasoda
0
140
watsonx.ai Dojo #3 プロンプトエンジニアリング入門
oniak3ibm
PRO
0
340
CSC305 Lecture 09
javiergs
PRO
0
110
.NET Aspireのクラウド対応検証: Azureと他環境での実践
ymd65536
1
650
デバッグの話 / Debugging for Beginners
kaityo256
PRO
8
720
Mercari AI/LLM Hackathon TeamBの発表資料
imaikosuke
0
180
メルカリ ハロ アプリの技術スタック
atsumo
2
880
Vue SFCのtemplateでTypeScriptの型を活用しよう
tsukkee
3
230
ACES Meet におけるリリース作業改善の取り組み
fukucheee
0
150
レガシーな Android アプリのリアーキテクチャ戦略
oidy
1
130
Integrating AI in Your Enterprise Java Applications
ivargrimstad
0
760
学生の時に開催したPerl入学式をきっかけにエンジニアが組織に馴染むために勉強会を主催や仲間と参加して職能間の境界を越えていく
ohmori_yusuke
2
320
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
31
2.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
26
700
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
31
1.7k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
664
120k
The Art of Programming - Codeland 2020
erikaheidi
51
13k
What's in a price? How to price your products and services
michaelherold
243
11k
Rails Girls Zürich Keynote
gr2m
93
13k
Six Lessons from altMBA
skipperchong
26
3.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
43
6.5k
Music & Morning Musume
bryan
46
6.1k
Optimizing for Happiness
mojombo
375
69k
YesSQL, Process and Tooling at Scale
rocio
167
14k
Transcript
© 2023 Wantedly, Inc. N+1 問題の解決と computed_model Oct. 5 2023
- Ryota Egusa (@gedorinku)
Wantedly のアーキテクチャ © 2023 Wantedly, Inc. Rails のマイクロサービス GraphQL のデータソースなどに使われる、汎用
的な API を持つ
加工した値を返すモデルのメソッド class User < ApplicationRecord has_many :work_experiences # => "ウォンテッドリー株式会社
/ エンジニア" def position_description work_experience = work_experiences.max_by { _1.started_at } "#{work_experience.company_name} / #{work_experience.position}" end end © 2023 Wantedly, Inc.
Preload と N+1 問題 class User < ApplicationRecord has_many :work_experiences
… end User.where(...).map(&:position_description) User.preload(:work_experiences).where(...).map(&:position_description) © 2023 Wantedly, Inc.
computed_model による解決方法 class User define_primary_loader :raw_user do ... end define_loader
:work_experiences do ... end dependency :work_experiences computed def position_description work_experience = work_experiences.max_by { _1.started_at } "#{work_experience.company_name} / #{work_experience.position}" end end © 2023 Wantedly, Inc. 依存関係をここに書く ここに書かれていないものを使うと エラーになる
Active Record をデータソースとして使う例 class User define_primary_loader :raw_user do |_, ids:,
**| RawUser.where(id: ids).map do |raw_user| User.new(raw_user) end end define_loader :work_experiences do ... end end © 2023 Wantedly, Inc.
他サービスの API をデータソースとして使う例 class User define_primary_loader :raw_user do ... end
define_loader :work_experiences, key: -> { id } do |user_ids, _, **| WorkExperienceApiClient.list(user_ids: user_ids).group_by(&:user_id) end end © 2023 Wantedly, Inc.
computed_model からデータを読む 指定していないフィールドを使うとエラーになる users = User.batch_get(user_ids, [:position_description]) users.map(&:position_description) users.map(&:name) #
=> error © 2023 Wantedly, Inc.
まとめ 1. 抽象化を損なわず依存関係解決 ◦ N+1問題を防ぎ、必要なデータだけ読み込む 2. データソースには Active Record に限らず
HTTP API なども使える © 2023 Wantedly, Inc. https://github.com/wantedly/computed_model