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
20241017_俺たちは雰囲気で scope をやっているけどもうちょっとなんとかならんのか?
Search
tokai235
October 17, 2024
Technology
0
740
20241017_俺たちは雰囲気で scope をやっているけどもうちょっとなんとかならんのか?
Reject on Rails 2024 at Gotanda.rb で話した内容です。
tokai235
October 17, 2024
Tweet
Share
Other Decks in Technology
See All in Technology
コンピュータビジョンの社会実装について考えていたらゲームを作っていた話
takmin
1
480
「正しく」失敗できる チームの作り方 〜リアルな事例から紐解く失敗を恐れない組織とは〜 / A team that can fail correctly
i35_267
1
520
白金鉱業Meetup Vol.17_あるデータサイエンティストのデータマネジメントとの向き合い方
brainpadpr
7
910
LINEギフトにおけるバックエンド開発
lycorptech_jp
PRO
0
110
深層学習と古典的画像アルゴリズムを組み合わせた類似画像検索内製化
shutotakahashi
1
260
コンテナサプライチェーンセキュリティ
kyohmizu
1
110
2.5Dモデルのすべて
yu4u
2
930
運用しているアプリケーションのDBのリプレイスをやってみた
miura55
1
830
ローカルLLMを活用したコード生成と、ローコード開発ツールへの応用
kazuhitoyokoi
0
130
IAMポリシーのAllow/Denyについて、改めて理解する
smt7174
2
160
Windows の新しい管理者保護モード
murachiakira
0
170
ESXi で仮想化した ARM 環境で LLM を動作させてみるぞ
unnowataru
0
130
Featured
See All Featured
A Philosophy of Restraint
colly
203
16k
BBQ
matthewcrist
87
9.5k
Mobile First: as difficult as doing things right
swwweet
223
9.3k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Music & Morning Musume
bryan
46
6.4k
It's Worth the Effort
3n
184
28k
The Cult of Friendly URLs
andyhume
78
6.2k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
Building an army of robots
kneath
303
45k
Designing for humans not robots
tammielis
250
25k
Practical Orchestrator
shlominoach
186
10k
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 やっていきましょう💪