くりにっき

フルスタックキュアエンジニアです

ActiveRecord::Relationを返さないクエリに対して雑にexplainする方法

最初にまとめ

tap 便利だった

やりたかったこと

SomeHistory.
  # 5〜6行くらいのなんか複雑な ActiveRecord::Relation のメソッドチェーン
  pluck(:user_id)

こういうクエリに対して雑に実行計画をとりたかった

pluck を呼んだ時点で戻り値がArrayになるので pluck(:user_id).explain ってのはできない。

かといってexplainのためだけに5〜6行くらいあるメソッドチェーンコピペしたくなかったのでどうすっかなーと思ったら tap を思いついた

やり方

pluckを呼ぶ直前にtapを仕込んでexplain

SomeHistory.
  # 5〜6行くらいのなんか複雑な ActiveRecord::Relation のメソッドチェーン

  # NOTE: 実行計画の結果が変わるため、selectがない場合はつけておく。tap { |ar| puts ar.select(:user_id).explain } とかでも可
  select(:user_id).

  tap { |ar| puts ar.explain }.
  pluck(:user_id)

余談

どうでもいいですが「雑(ざつ)」と「tap(たっぷ)」って語感似てますよね?