From e67b17dd6fd31071c079851e773ab9102562b9c5 Mon Sep 17 00:00:00 2001 From: Oleksii Kriuchykhin Date: Mon, 13 Dec 2021 16:43:16 +0100 Subject: [PATCH] Optimize loading of project and experiment cards [SCI-6346] --- app/helpers/comment_helper.rb | 2 +- app/models/activity.rb | 6 +++--- app/models/concerns/user/team_roles.rb | 4 ++-- app/models/concerns/viewable_model.rb | 2 +- app/models/project.rb | 2 -- app/permissions/experiment.rb | 5 +---- app/permissions/project.rb | 15 +++++++-------- app/services/experiments_overview_service.rb | 2 ++ app/services/projects_overview_service.rb | 6 +++--- .../index/_project_actions_dropdown.html.erb | 2 +- app/views/projects/show/_experiment_card.html.erb | 2 +- .../_experiment_workflow_image_container.html.erb | 2 +- .../projects/show/_experiments_list.html.erb | 4 +++- 13 files changed, 26 insertions(+), 28 deletions(-) diff --git a/app/helpers/comment_helper.rb b/app/helpers/comment_helper.rb index 3b8beca79..4c2247995 100644 --- a/app/helpers/comment_helper.rb +++ b/app/helpers/comment_helper.rb @@ -274,6 +274,6 @@ module CommentHelper end def has_unseen_comments?(commentable) - commentable.comments.where('? = ANY (unseen_by)', current_user.id).any? + commentable.comments.any? { |comment| comment.unseen_by.include?(current_user.id) } end end diff --git a/app/models/activity.rb b/app/models/activity.rb index 87ee225d0..088838615 100644 --- a/app/models/activity.rb +++ b/app/models/activity.rb @@ -112,14 +112,14 @@ class Activity < ApplicationRecord def self.url_search_query(filters) result = [] filters.each do |filter, values| - result.push(values.to_query(filter)) + result.push(values.map { |k, v| { k => v.collect(&:id) } }.to_query(filter)) end if filters[:subjects] subject_labels = [] filters[:subjects].each do |object, values| values.each do |value| - label = object.to_s.constantize.find_by_id(value).name - subject_labels.push({ value: value, label: label, object: object.downcase, group: '' }.as_json) + label = value.name + subject_labels.push({ value: value.id, label: label, object: object.downcase, group: '' }.as_json) end end result.push(subject_labels.to_query('subject_labels')) diff --git a/app/models/concerns/user/team_roles.rb b/app/models/concerns/user/team_roles.rb index 148bb4af2..39782e99f 100644 --- a/app/models/concerns/user/team_roles.rb +++ b/app/models/concerns/user/team_roles.rb @@ -13,7 +13,7 @@ module User::TeamRoles is_guest_of_team? ) do |proxy, *args, &block| if args[0] - @user_team = user_teams.where(team: args[0]).take + @user_team = args[0]&.user_teams&.find { |ut| ut.user == self } @user_team ? proxy.call(*args, &block) : false else false @@ -41,4 +41,4 @@ module User::TeamRoles def is_guest_of_team?(team) @user_team.guest? end -end \ No newline at end of file +end diff --git a/app/models/concerns/viewable_model.rb b/app/models/concerns/viewable_model.rb index 731d7783c..6ec86a89e 100644 --- a/app/models/concerns/viewable_model.rb +++ b/app/models/concerns/viewable_model.rb @@ -20,7 +20,7 @@ module ViewableModel end def current_view_state(user) - state = view_states.where(user: user).take + state = view_states.find_by(user: user) state || view_states.create!(user: user, state: default_view_state) end end diff --git a/app/models/project.rb b/app/models/project.rb index dbec33376..2df597e8c 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -54,8 +54,6 @@ class Project < ApplicationRecord has_many :reports, inverse_of: :project, dependent: :destroy has_many :report_elements, inverse_of: :project, dependent: :destroy - default_scope { includes(user_assignments: :user_role) } - accepts_nested_attributes_for :user_assignments, allow_destroy: true, reject_if: :all_blank diff --git a/app/permissions/experiment.rb b/app/permissions/experiment.rb index 379d029d7..a3f56ed7b 100644 --- a/app/permissions/experiment.rb +++ b/app/permissions/experiment.rb @@ -19,10 +19,7 @@ Canaid::Permissions.register_for(Experiment) do # assign/reassign/unassign tags can :manage_experiment do |user, experiment| experiment.permission_granted?(user, ExperimentPermissions::MANAGE) && - MyModule.joins(:experiment) - .where(experiment: experiment) - .preload(my_module_status: :my_module_status_implications) - .all? do |my_module| + experiment.my_modules.all? do |my_module| if my_module.my_module_status my_module.my_module_status.my_module_status_implications.all? { |implication| implication.call(my_module) } else diff --git a/app/permissions/project.rb b/app/permissions/project.rb index e1e965823..307aca19c 100644 --- a/app/permissions/project.rb +++ b/app/permissions/project.rb @@ -26,14 +26,13 @@ Canaid::Permissions.register_for(Project) do can :manage_project do |user, project| project.permission_granted?(user, ProjectPermissions::MANAGE) && - MyModule.joins(experiment: :project) - .where(experiments: { project: project }) - .preload(my_module_status: :my_module_status_implications) - .all? do |my_module| - if my_module.my_module_status - my_module.my_module_status.my_module_status_implications.all? { |implication| implication.call(my_module) } - else - true + project.experiments.each do |experiment| + experiment.my_modules.all? do |my_module| + if my_module.my_module_status + my_module.my_module_status.my_module_status_implications.all? { |implication| implication.call(my_module) } + else + true + end end end end diff --git a/app/services/experiments_overview_service.rb b/app/services/experiments_overview_service.rb index 8639445b9..dca191a6b 100644 --- a/app/services/experiments_overview_service.rb +++ b/app/services/experiments_overview_service.rb @@ -35,6 +35,8 @@ class ExperimentsOverviewService def fetch_records @project.experiments .joins(:project) + .includes(my_modules: { my_module_status: :my_module_status_implications }) + .includes(workflowimg_attachment: :blob, user_assignments: %i(user_role user)) .joins('LEFT OUTER JOIN my_modules AS active_tasks ON active_tasks.experiment_id = experiments.id ' \ 'AND active_tasks.archived = FALSE') .joins('LEFT OUTER JOIN my_modules AS active_completed_tasks ON active_completed_tasks.experiment_id '\ diff --git a/app/services/projects_overview_service.rb b/app/services/projects_overview_service.rb index 696a91caf..a8ecbc3ae 100644 --- a/app/services/projects_overview_service.rb +++ b/app/services/projects_overview_service.rb @@ -86,10 +86,10 @@ class ProjectsOverviewService def fetch_project_records @team.projects - .includes(user_assignments: :user_role) + .includes(user_assignments: %i(user user_role), team: :user_teams) + .includes(:project_comments, experiments: { my_modules: { my_module_status: :my_module_status_implications } }) .visible_to(@user, @team) .left_outer_joins(:project_comments) - .preload(team: :user_teams) .select('projects.*') .select('COUNT(DISTINCT comments.id) AS comment_count') .group('projects.id') @@ -97,7 +97,7 @@ class ProjectsOverviewService def fetch_project_folder_records project_folders = @team.project_folders - .preload(team: :user_teams) + .includes(team: :user_teams) .joins('LEFT OUTER JOIN project_folders child_folders ON child_folders.parent_folder_id = project_folders.id') .left_outer_joins(:projects) diff --git a/app/views/projects/index/_project_actions_dropdown.html.erb b/app/views/projects/index/_project_actions_dropdown.html.erb index 1ba0e419f..b62e95b49 100644 --- a/app/views/projects/index/_project_actions_dropdown.html.erb +++ b/app/views/projects/index/_project_actions_dropdown.html.erb @@ -74,7 +74,7 @@
  • - + <%= t('projects.index.activities_option') %> diff --git a/app/views/projects/show/_experiment_card.html.erb b/app/views/projects/show/_experiment_card.html.erb index f6a3773c9..922223b3d 100644 --- a/app/views/projects/show/_experiment_card.html.erb +++ b/app/views/projects/show/_experiment_card.html.erb @@ -7,7 +7,7 @@ data-restorable="<%= experiment.archived? && can_restore_experiment?(experiment) %>" data-duplicable="<%= can_clone_experiment?(experiment) %>">
    - <% if can_manage_project?(experiment.project) %> + <% if project_is_managable %>
    diff --git a/app/views/projects/show/_experiment_workflow_image_container.html.erb b/app/views/projects/show/_experiment_workflow_image_container.html.erb index 6daf6e3e5..4c650dc5b 100644 --- a/app/views/projects/show/_experiment_workflow_image_container.html.erb +++ b/app/views/projects/show/_experiment_workflow_image_container.html.erb @@ -2,7 +2,7 @@
    -<% elsif experiment.my_modules.active.any? %> +<% elsif experiment.my_modules.any?(&:active?) %> <% if experiment.workflowimg.attached? %>
    <%= render partial: 'projects/show/workflow_img.html.erb', locals: { experiment: experiment } %> diff --git a/app/views/projects/show/_experiments_list.html.erb b/app/views/projects/show/_experiments_list.html.erb index e48118423..02fafa71a 100644 --- a/app/views/projects/show/_experiments_list.html.erb +++ b/app/views/projects/show/_experiments_list.html.erb @@ -5,9 +5,11 @@
    <%= t('projects.index.no_results_description') %>
    <% else %> + <% project_is_managable = can_manage_project?(@project) %> <% cards.each do |card| %> <% cache [current_user, card] do %> - <%= render partial: 'projects/show/experiment_card', locals: { experiment: card, project: @project } %> + <%= render partial: 'projects/show/experiment_card', + locals: { experiment: card, project: @project, project_is_managable: project_is_managable } %> <% end %> <% end %> <% end %>