I am using ROR 6.1.3, Postgresql. I faced on issues following:
- puma memory limit is 1024 but query takes more than 1200 Is there any way to reduce memory usage?
- 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