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
230
Other Decks in Technology
See All in Technology
ソースを読む時の思考プロセスの例-MkDocs
sat
PRO
1
230
【SORACOM UG Explorer 2025】さらなる10年へ ~ SORACOM MVC 発表
soracom
PRO
0
150
OTEPsで知るOpenTelemetryの未来 / Observability Conference Tokyo 2025
arthur1
0
260
ストレージエンジニアの仕事と、近年の計算機について / 第58回 情報科学若手の会
pfn
PRO
3
860
ハノーファーメッセ2025で見た生成AI活用ユースケース.pdf
hamadakoji
1
480
頭部ふわふわ浄酔器
uyupun
0
110
生成AI時代のPythonセキュリティとガバナンス
abenben
0
140
.NET 10のBlazorの期待の新機能
htkym
0
110
CREが作る自己解決サイクルSlackワークフローに組み込んだAIによる社内ヘルプデスク改革 #cre_meetup
bengo4com
0
340
あなたの知らない Linuxカーネル脆弱性の世界
recruitengineers
PRO
3
160
混合雲環境整合異質工作流程工具運行關鍵業務 Job 的經驗分享
yaosiang
0
190
激動の時代を爆速リチーミングで乗り越えろ
sansantech
PRO
1
110
Featured
See All Featured
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
34
2.3k
Mobile First: as difficult as doing things right
swwweet
225
10k
GitHub's CSS Performance
jonrohan
1032
470k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
5.7k
Being A Developer After 40
akosma
91
590k
Bash Introduction
62gerente
615
210k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
130k
How GitHub (no longer) Works
holman
315
140k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Product Roadmaps are Hard
iamctodd
PRO
55
11k
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 やっていきましょう💪