我是一个经验丰富的程序员,对ruby/rails和数据库比较陌生。我已经创建了一个用于注册课程的大型网站。我认为我使用scope和has_many创建课程注册类别是很聪明的。从逻辑上讲,它很好地封装了信息,但我的页面现在加载得非常慢,试图急切加载会让我感到困惑。
我有课程、人员、CourseRole (学生、教师等)和CourseSignup的模型,其中包括每个(课程、人员、CourseRole)中的一个。这一切都很顺利。最近,我在CourseRole中设置了作用域来定义注册的类别(我一直在对角色名称进行硬编码,并希望摆脱这种情况)。然后,我在课程中为每个类别设置has_many关系。所以,课程本身就是has_many course_signups的,并且有我的分类
has_many :student_signups, -> { CourseSignup.student }, class_name: 'CourseSignup', foreign_key: :course_id
has_many :teacher_signups, -> { CourseSignup.teacher }, class_name: 'CourseSignup', foreign_key: :course_id等等(我有6个类别)。我有一个页面,其中列出了所有课程和每个课程的所有注册。像这样:
Dodge Ball:
info about course
Students:
names of students
Teachers:
names of teachers
etc.这个页面加载的速度非常慢。我试图将include语句添加到查询中(基于Bullet gem的建议),但这实际上会使查询速度变慢。这让我觉得我把事情搞得太复杂了,但我知道的还不够多,不知道如何修复它。我想我应该重组我的模型。但是我喜欢作用域/has_many的抽象
该页面是通过呈现显示一个课程的部分循环生成的。
@courses = @cuco_session.assigned_courses.includes(:period).order('periods.start_time')有效,但速度非常慢。
@courses = @cuco_session.assigned_courses
.includes(course_signups: [:person, :course_role])
.includes([:courses_rooms, :rooms])
.includes([:helper_signups, :student_signups, :volunteer_signups, :waiting_list_signups, :person_in_room_signups])
.includes(:period).order('periods.start_time')也是有效的,但速度更慢。
发布于 2019-09-08 00:38:46
我们需要更多关于视图中实际发生的事情的信息,才能真正回答为什么你的页面速度很慢。
此外,还需要一个显示实际SQL的日志片段。
您提到刚开始通过Rails在线使用数据库。如果不深入研究其中一些模型的结构,就很难给出建议,但是您是否考虑过在Course和Person之间只使用一个连接表来替换CourseSignup?看起来这就是你要说的,但很难说清楚。
发布于 2019-09-09 17:08:56
*has_many :student_signups,-> { CourseSignup.student },class_name:'CourseSignup',foreign_key::course_id
has_many :teacher_signups,-> { CourseSignup.teacher },class_name:'CourseSignup',foreign_key::course_id*
上面的代码可以使用单个表继承进行重构
# app/models/person.rb
class Person < ApplicationRecord
#your code
end
# app/models/teacher.rb
class Teacher < Person
#your code
end
# app/models/student.rb
class Student < Person
#your code
end对于课程角色,您可以有一个单独的角色主表,并将Person表和Role表的引用放在课程角色表中
我希望上面的解决方案能对你的问题有所帮助。
https://stackoverflow.com/questions/57830464
复制相似问题