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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
tokai235
October 17, 2024
Technology
1.2k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
俺たちは雰囲気で scope をやっているけどもうちょっとなんとかならんのか?
2024/10/17 の Reject on Rails 2024 at Gotanda.rb で話した内容です。
tokai235
October 17, 2024
More Decks by tokai235
See All by tokai235
toB プロダクトから見たWAF
tokai235
0
330
チームの境界をブチ抜いていけ
tokai235
0
720
Other Decks in Technology
See All in Technology
AI時代のデータ基盤を考える問い
pacocat
0
280
カーネルまで探検して理解するふたつの自動計装
sumiyae
0
260
Kiro Crew入門 - 常駐エージェントの仕組みと使いどころ / Intro to Kiro Crew
k_adachi_01
1
840
MIXIで活躍できるエンジニアを 若手社員目線で考えてみる
mixi_engineers
PRO
0
140
2026-08-15 JAWS-UG 茨城 #16 Secrets ManagerにおけるSecret値の管理(Terraformの場合) / Secrets Manager Secrets
masasuzu
0
560
巨大気象データと戦う ― サロゲートモデル学習を高速化する圧縮技術
gpuunite_official
0
250
FORENSIA: ローカルLLMフォレンジックハーネス
sumeshi
2
450
形式手法特論:Hyperproperty とモデル検査 #kernelvm / Kernel VM Study Tokyo 19th
ytaka23
0
730
AIに狂うスタートアップが、あえて「人との協働」に全振りした新卒エンジニア研修 / New Graduate Engineer Training at a Startup Accelerating AI Adoption
ohnoeight
0
190
Go 1.27 の標準パッケージに uuid が入った!のでいろいろ喋る / go_127_std_go_uuid
convto
3
650
アクセスキーが漏れた日にやるべきこと- 無効化の先にある本当の対応
kazzpapa3
0
280
dbt in Microsoft Fabric
ryomaru0825
0
200
Featured
See All Featured
Bash Introduction
62gerente
615
220k
Faster Mobile Websites
deanohume
310
32k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Amusing Abliteration
ianozsvald
1
260
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
490
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
A Soul's Torment
seathinner
6
3.5k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
260
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
550
Paper Plane (Part 1)
katiecoart
PRO
1
10k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
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 やっていきましょう💪