rails console
したときこのようなことをすると都度クエリが実行された。
> u = User.where(status: 1)
> u = u.where(type: 1)
これをワンライナーで書いたときはそうではない。
> u = User.where(status: 1).where(type: 1)
そんないい感じにクエリを出す出さないをやっていることはないと思うので、これを深堀りしてみた。
いろいろ試すと、どうやら Object#inspect
をrails console(実態としてはirb)が最後に呼び出しているみたい。
https://docs.ruby-lang.org/ja/latest/method/Object/i/inspect.html
同じ内容が出る様子。
> User.where(status: 1).where(type: 1).inspect
> u = User.where(status: 1).where(type: 1)
このinspectメソッドはActiveRecordに定義されていてそれを使っている。
User.where(status: 1).where(type: 1).method(:inspect).source_location
これを見ると、ビルドしたクエリを実行してデータを整形して表示しようとしている。なので、2行に分けた場合、実態としてはこうなっていて、都度クエリが実行されていた、ということになる。
> u = User.where(status: 1); u.inspect
> u = u.where(type: 1); u.inspect