Rails5にバージョンアップするにあたって、どうやら検索クエリの実行されるタイミングが変わったらしく、検索用のクエリを発行するまでに二回もSQLが吐かれるようになってしまいました。
ruby
1# app/models/search/user.rb 2 3def matches 4 users = ::User.all 5 # ほんとはもっと複雑な検索ロジックなのですが、問題の部分だけをピックアップしておきました。 6 # とりあえずここの部分が入っているだけで、結構な量のSQLになるので… 7 # 「検索ロジック自体に問題がある」というよりかは、「早い段階でSQLを発行されてしまう」こと自体に問題があるように思います 8 users = users.preload(corporation: :region) 9 users = users.left_joins(:corporation) 10 users = users.corporation_name_like(name) if name.present? 11 users 12end
ruby
1# app/controllers/user_controller.rb 2 3def search 4 @users = Search::User.new(search_params).matches 5 # Rails5では、この時点でSQLを一度発行するようになってしまった 6 @users = @users.order(:name) 7 .page(params[:page]) 8 .per(20) 9 # Rails4ではここまで来てようやくSQLを発行していた 10end
以前はsearchメソッドの最後に行くまでSQLが発行されなかったので、kaminariのpagenateによるLIMITがかかり、検索時間も全くかからなかったのですが、Rails5にあげてからはmatches関数の後で一回SQLが発行されるようになってしまったがために、すさまじい量のデータを毎回ロードする羽目になってしまいます。
質問というのは、
・どうやったらSQL発行のタイミングを制御できるのか
ということです
お願いいたします
回答1件
あなたの回答
tips
プレビュー