はじめに
これは私が ActiveRecord::Relation に対して present? や blank? メソッドを使用したら API サーバが機嫌を悪くしてレスポンスを返してくれなくなったので、なんで機嫌を損ねたのかを共有するための記事です。
なんで機嫌を損ねたの?
さていきなり本題です。なぜ API サーバが機嫌を悪くしたのか?それを解き明かすために、まずは ActiveRecord::Relation に対して present? や blank? メソッドを使用するとどのような流れで ActiveRecord::Relation が存在しているかを評価するのか確認しましょう。評価の流れは大まかに以下の流れで実行されます。
- 格納している条件を元にクエリを発行
- クエリ実行結果をメモリにロード
- 存在チェック
はい、ここで感の良い皆様なら既にお気づきでしょう。問題なのは「2. クエリ実行結果をメモリにロード 」の部分です。結果が何百万レコードもあるクエリを発行すると「2. クエリ実行結果をメモリにロード 」で API サーバーがお腹いっぱいにも関わらず、更にデータをお腹に詰め込もうとします。鬼畜ですね。私も同じことされたら機嫌を悪くするどころじゃ済まないです。
ということでデータ件数が膨大になりそうな ActiveRecord::Relation に present? や blank? を使用するのはやめて API サーバーと仲良くしていきましょうというお話でした。
参考