fix some n+1's on user dashboard

don't re-fetch dashboard positions and preload roles

test plan:
* dashboard should load

closes #LA-911

Change-Id: I324b9a31ecb90660348320eb72163ec7358796fa
Reviewed-on: https://gerrit.instructure.com/c/canvas-lms/+/233661
Tested-by: Service Cloud Jenkins <svc.cloudjenkins@instructure.com>
Reviewed-by: Jeremy Stanley <jeremy@instructure.com>
QA-Review: Jeremy Stanley <jeremy@instructure.com>
Product-Review: James Williams <jamesw@instructure.com>
This commit is contained in:
James Williams 2020-04-10 08:12:06 -06:00
parent 5e22ade458
commit b85f7553a4
5 changed files with 21 additions and 24 deletions

View File

@ -30,7 +30,7 @@ class Course < ActiveRecord::Base
include Courses::ItemVisibilityHelper
include OutcomeImportContext
attr_accessor :teacher_names, :master_course
attr_accessor :teacher_names, :master_course, :primary_enrollment_role
attr_writer :student_count, :teacher_count, :primary_enrollment_type, :primary_enrollment_role_id, :primary_enrollment_rank, :primary_enrollment_state, :primary_enrollment_date, :invitation, :master_migration
time_zone_attribute :time_zone

View File

@ -1479,10 +1479,11 @@ class User < ActiveRecord::Base
end
def dashboard_positions
get_preference(:dashboard_positions) || {}
@dashboard_positions ||= get_preference(:dashboard_positions) || {}
end
def set_dashboard_positions(new_positions)
@dashboard_positions = nil
set_preference(:dashboard_positions, new_positions)
end
@ -1743,6 +1744,10 @@ class User < ActiveRecord::Base
end
end
Shard.partition_by_shard(res, ->(c){ c.shard }) do |shard_courses|
roles = Role.where(:id => shard_courses.map(&:primary_enrollment_role_id).uniq).to_a.index_by(&:id)
shard_courses.each{|c| c.primary_enrollment_role = roles[c.primary_enrollment_role_id]}
end
@courses_with_primary_enrollment[cache_key] =
res.sort_by{ |c| [c.primary_enrollment_rank, Canvas::ICU.collation_key(c.name)] }
end

View File

@ -72,10 +72,6 @@ class CourseForMenuPresenter
end
private
def role
Role.get_role_by_id(Shard.relative_id_for(course.primary_enrollment_role_id, course.shard, Shard.current)) ||
Enrollment.get_built_in_role_for_type(course.primary_enrollment_type)
end
def subtitle
label = if course.primary_enrollment_state == 'invited'
@ -83,7 +79,7 @@ class CourseForMenuPresenter
else
before_label('#shared.menu_enrollment.labels.enrolled_as', 'enrolled as')
end
[ label, role.try(:label) ].join(' ')
[ label, course.primary_enrollment_role.try(:label) ].join(' ')
end
def term

View File

@ -769,6 +769,19 @@ describe User do
@user.favorites.create!(:context => @course)
expect(@user.courses_with_primary_enrollment(:favorite_courses)).to eq [@course]
end
it "loads the roles correctly" do
@user = User.create!(:name => 'user')
@shard1.activate do
account = Account.create!
@course = account.courses.create!(:workflow_state => 'available')
@role = account.roles.create!(:name => "custom student", :base_role_type => "StudentEnrollment")
StudentEnrollment.create!(:course => @course, :user => @user, :workflow_state => 'active', :role => @role)
end
fetched_courses = @user.courses_with_primary_enrollment(:current_and_invited_courses, nil, :include_completed_courses => true)
expect(fetched_courses.count).to eq 1
expect(fetched_courses.first.primary_enrollment_role).to eq @role
end
end
end

View File

@ -123,21 +123,4 @@ describe CourseForMenuPresenter do
end
end
describe '#role' do
specs_require_sharding
it "should retrieve the correct role for cross-shard enrollments" do
@shard1.activate do
account = Account.create
@role = account.roles.create :name => "1337 Student"
@role.base_role_type = 'StudentEnrollment'
@role.save!
@cs_course = account.courses.create!
@cs_course.primary_enrollment_role_id = @role.local_id
end
cs_presenter = CourseForMenuPresenter.new(@cs_course)
expect(cs_presenter.send(:role)).to eq @role
end
end
end