From 9f8e4423332768d82df49d28238289cc8f3cb393 Mon Sep 17 00:00:00 2001 From: Sojan Jose Date: Thu, 17 Mar 2022 15:57:32 +0530 Subject: [PATCH] chore: Improve n+1 queries (#4202) Fixes the n+1 queries that get triggered while accessing agents endpoint --- app/controllers/api/v1/accounts/agents_controller.rb | 2 +- app/models/user.rb | 4 +++- app/views/api/v1/models/_agent.json.jbuilder | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/v1/accounts/agents_controller.rb b/app/controllers/api/v1/accounts/agents_controller.rb index a666d1a67..68389d3cd 100644 --- a/app/controllers/api/v1/accounts/agents_controller.rb +++ b/app/controllers/api/v1/accounts/agents_controller.rb @@ -68,7 +68,7 @@ class Api::V1::Accounts::AgentsController < Api::V1::Accounts::BaseController end def agents - @agents ||= Current.account.users.order_by_full_name.includes({ avatar_attachment: [:blob] }) + @agents ||= Current.account.users.order_by_full_name.includes(:account_users, { avatar_attachment: [:blob] }) end def validate_limit diff --git a/app/models/user.rb b/app/models/user.rb index cbb06b39a..ad4abc142 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -108,7 +108,9 @@ class User < ApplicationRecord end def current_account_user - account_users.find_by(account_id: Current.account.id) if Current.account + # We want to avoid subsequent queries in case where the association is preloaded. + # using where here will trigger n+1 queries. + account_users.find { |ac_usr| ac_usr.account_id == Current.account.id } if Current.account end def available_name diff --git a/app/views/api/v1/models/_agent.json.jbuilder b/app/views/api/v1/models/_agent.json.jbuilder index fd7119ca5..02601d6b0 100644 --- a/app/views/api/v1/models/_agent.json.jbuilder +++ b/app/views/api/v1/models/_agent.json.jbuilder @@ -1,6 +1,6 @@ json.id resource.id # could be nil for a deleted agent hence the safe operator before account id -json.account_id resource.account&.id +json.account_id Current.account&.id json.availability_status resource.availability_status json.auto_offline resource.auto_offline json.confirmed resource.confirmed?