ROR: How to reduce query takes puma memory

148 Views Asked by At

I am using ROR 6.1.3, Postgresql. I faced on issues following:

  1. puma memory limit is 1024 but query takes more than 1200 Is there any way to reduce memory usage?
  2. Query executed with a lot of related tables and serialize many fields. So, it takes too long time. Is there any way to reduce serializing time?

These are my code: Mainly takes time and memory on last two code lines.

def get_project_members
param! :project_code, String, required: true
param! :page, Integer, default: 1
param! :working_status, String
param! :position, String
param! :performance_status, String
param! :is_active, :boolean

limit_per_page = 20
display_page = params[:page]

project_members_scope = current_user.company.search_members(params: params).is_displayable

totalMembers = project_members_scope.size

project_members_scope = project_members_scope.left_joins(:latest_company_service_action_log).select("members.*, company_service_action_logs.actioned_at").order("company_service_action_logs.actioned_at desc NULLS LAST")

display_page = 1 if project_members_scope.page(params[:page]).per(limit_per_page).out_of_range?
project_members_scope = project_members_scope.page(display_page).per(limit_per_page)

project_members_scope = project_members_scope.includes(:company, figma_user: :company_service_action_logs, jira_user: :company_service_action_logs, github_user: :company_service_action_logs, slack_user: :company_service_action_logs)

render json: {
  members: ActiveModelSerializers::SerializableResource.new(project_members_scope, adapter: :attributes).as_json,
  totalMembers: totalMembers,
  displayPage: display_page
}, status: :ok

end

And this is member serilizer:

class MemberSerializer < ActiveModel::Serializer
attributes :code,
         :icon_img_url,
         :name,
         :performance_status,
         :working_status,
         :working_range,
         :working_hours_value,
         :working_hours_unit,
         :latest_company_service_action_log,
         :monthly_pay,
         :estimated_hourly_pay,
         :display_working_status,
         :display_working_hours,
         :current_communication_mom_percent,
         :current_output_mom_percent,
         :is_active

 has_one :company, serializer: CompanySerializer

 has_one :service1_user, serializer: Service1Serializer
 has_one :service2_user, serializer: Service2Serializer
 has_one :service3_user, serializer: Service3Serializer
 has_one :service4_user, serializer: Service4Serializer
 has_one :position, serializer: PositionSerializer

 delegate :estimated_hourly_pay, to: :object
 delegate :display_working_hours, to: :object

 def latest_company_service_action_log
   return {} if object.latest_company_service_action_log.nil?

ActiveModelSerializers::SerializableResource.new(object.latest_company_service_action_log, adapter: :attributes, serializer: SimpleCompanyServiceActionLogSerializer).as_json
end

 def icon_img_url
   object.display_icon_img_url
 end

 def display_working_status
   object.working_status_i18n
 end
end
0

There are 0 best solutions below