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
俺たちは雰囲気で scope をやっているけどもうちょっとなんとかならんのか?
Search
tokai235
October 17, 2024
Technology
0
1k
俺たちは雰囲気で scope をやっているけどもうちょっとなんとかならんのか?
2024/10/17 の Reject on Rails 2024 at Gotanda.rb で話した内容です。
tokai235
October 17, 2024
Tweet
Share
More Decks by tokai235
See All by tokai235
チームの境界をブチ抜いていけ
tokai235
0
240
Other Decks in Technology
See All in Technology
ゼロコード計装導入後のカスタム計装でさらに可観測性を高めよう
sansantech
PRO
1
580
Observability — Extending Into Incident Response
nari_ex
1
610
serverless team topology
_kensh
3
250
20251102 WordCamp Kansai 2025
chiilog
0
190
251029 JAWS-UG AI/ML 退屈なことはQDevにやらせよう
otakensh
0
120
オブザーバビリティが育むシステム理解と好奇心
maruloop
3
1.7k
20251029_Cursor Meetup Tokyo #02_MK_「あなたのAI、私のシェル」 - プロンプトインジェクションによるエージェントのハイジャック
mk0721
PRO
6
2.1k
ViteとTypeScriptのProject Referencesで 大規模モノレポのUIカタログのリリースサイクルを高速化する
shuta13
3
230
JAWS UG AI/ML #32 Amazon BedrockモデルのライフサイクルとEOL対応/How Amazon Bedrock Model Lifecycle Works
quiver
1
360
.NET 10のBlazorの期待の新機能
htkym
0
160
プレイドのユニークな技術とインターンのリアル
plaidtech
PRO
1
550
データとAIで明らかになる、私たちの課題 ~Snowflake MCP,Salesforce MCPに触れて~ / Data and AI Insights
kaonavi
0
190
Featured
See All Featured
Fireside Chat
paigeccino
41
3.7k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Agile that works and the tools we love
rasmusluckow
331
21k
4 Signs Your Business is Dying
shpigford
186
22k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
359
30k
Designing for humans not robots
tammielis
254
26k
Visualization
eitanlees
150
16k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.2k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
630
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Navigating Team Friction
lara
190
15k
How to Ace a Technical Interview
jacobian
280
24k
Transcript
俺たちは雰囲気で scope をやっているけど もうちょっとなんとかならんのか? Reject on Rails 2024 Gotanda.rb 2024-10-17
tokai235
自己紹介 • tokai235(トーカイ) です • 現実世界ではギフティで働いています ◦ 関西在住なのでこのオフィスでは「たまにいる人」です • 実は
Gotanda.rb 初参加、初登壇です ◦ そんなことある? ◦ やっていきます
Rails の scope 使ってますか?
scope とは • Rails Guidesによると ◦ よく使うクエリをスコープに設定すると、関連オブジェクトやモデルへのメソッ ド呼び出しとして参照できるようになります。 ◦ ref:
https://railsguides.jp/active_record_querying.html#スコープ こういうやつ (Rails Guides から抜粋)
もうちょっとわかりやすく • SQL のパーツを Rails で書けるくんです • 共通化や再利用ができるようになります
便利な scope ですが... こう思ったことないですか?
class method と 何が違うの?
そうなんすよ • 実は↓の2つは同じ挙動をします • シンプルな使い方をしている場合はどちらでも結果が同じ ◦ これがむずい この2つは同じ挙動
じゃあ何が違うのか(定義編) • ぶっちゃけこれに尽きます • どのスコープメソッドも、常にActiveRecord::Relationオブジェクトを返しま す。 • ref: https://railsguides.jp/active_record_querying.html#スコープ
どういうこと? • scope で返していいのは SQL のパーツだけです ◦ メソッドチェーンがつながらなくなるので ◦ Rails
Guides でも↓のように言っています ▪ スコープの本体では、別のスコープなどのメソッドをスコープ上で呼び出せ るようにするため、ActiveRecord::Relation か nil のいずれかを返すように すべきです。 ▪ ref: https://railsguides.jp/active_record_querying.html#スコープ ◦ nil は何もしない扱いになります
たとえば • こういうのはだめです • pluck はただの array を返すので、その後の with_many_comments を解釈できずに
エラーになります • pluck(:id) は class method などで追加しましょう
じゃあ何が違うのか(実装編) • scope の利点は scope で使えることです ◦ 哲学ですね • has_many
で使えたり • リレーション先のクエリで使えたり • これらは class method ではできません • データの取得を SQL に寄せることで、パフォー マンスやメモリ効率を良くすることができます ◦ 大規模データの扱いは SQL が得意です ◦ 事前の絞り込みで余計なインスタンスを作 らずに済みます
使ってよかった scope • そもそも今回のテーマは筆者がパフォーマンス改善をした中で得た知見をまとめた ものです • 何を改善したの? ◦ 使える商品の一覧を金額でソートして取得する ◦
これを SQL でなく Rails の class method や instance method で処理してま した ▪ map とか filter とか ◦ これに結構時間がかかってました
使ってよかった scope • どうやったの? ◦ map, filter などを scope に置き換
えて、SQL の時点でフィルタリング やソートがされるようにしました • どうだった? ◦ response time が 1/2 ~ 1/3 に改 善しました ▪ 特に p99th が良好 ◦ 詳細知りたい方はビール飲みながら お話しましょう
まとめ • scope は SQL のパーツを Rails で書けるくんです ◦ おかげで
SQL の共通化や再利用ができます ◦ 組み合わせると柔軟に SQL クエリが書けます • scope を使うときは SQL のパーツを返すようにしましょう ◦ メソッドチェーンがつながるように • データの取得を適切に SQL でハンドリングすることで、パフォーマンスやメモリ 効率をよくできます
scope やっていきましょう💪