Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20241017_俺たちは雰囲気で scope をやっているけどもうちょっとなんとかならんのか?

tokai235
October 17, 2024

20241017_俺たちは雰囲気で scope をやっているけどもうちょっとなんとかならんのか?

Reject on Rails 2024 at Gotanda.rb で話した内容です。

tokai235

October 17, 2024
Tweet

Other Decks in Technology

Transcript

  1. どういうこと? • scope で返していいのは SQL のパーツだけです ◦ メソッドチェーンがつながらなくなるので ◦ Rails

    Guides でも↓のように言っています ▪ スコープの本体では、別のスコープなどのメソッドをスコープ上で呼び出せ るようにするため、ActiveRecord::Relation か nil のいずれかを返すように すべきです。 ▪ ref: https://railsguides.jp/active_record_querying.html#スコープ ◦ nil は何もしない扱いになります
  2. じゃあ何が違うのか(実装編) • scope の利点は scope で使えることです ◦ 哲学ですね • has_many

    で使えたり • リレーション先のクエリで使えたり • これらは class method ではできません • データの取得を SQL に寄せることで、パフォー マンスやメモリ効率を良くすることができます ◦ 大規模データの扱いは SQL が得意です ◦ 事前の絞り込みで余計なインスタンスを作 らずに済みます
  3. 使ってよかった scope • そもそも今回のテーマは筆者がパフォーマンス改善をした中で得た知見をまとめた ものです • 何を改善したの? ◦ 使える商品の一覧を金額でソートして取得する ◦

    これを SQL でなく Rails の class method や instance method で処理してま した ▪ map とか filter とか ◦ これに結構時間がかかってました
  4. 使ってよかった scope • どうやったの? ◦ map, filter などを scope に置き換

    えて、SQL の時点でフィルタリング やソートがされるようにしました • どうだった? ◦ response time が 1/2 ~ 1/3 に改 善しました ▪ 特に p99th が良好 ◦ 詳細知りたい方はビール飲みながら お話しましょう
  5. まとめ • scope は SQL のパーツを Rails で書けるくんです ◦ おかげで

    SQL の共通化や再利用ができます ◦ 組み合わせると柔軟に SQL クエリが書けます • scope を使うときは SQL のパーツを返すようにしましょう ◦ メソッドチェーンがつながるように • データの取得を適切に SQL でハンドリングすることで、パフォーマンスやメモリ 効率をよくできます