【发布时间】:2020-01-09 19:56:14
【问题描述】:
我是一位经验丰富的程序员,对 ruby/rails 和数据库比较陌生。我创建了一个用于注册课程的大型网站。我认为我很聪明地使用范围和 has_many 创建课程注册类别。从逻辑上讲,它很好地封装了信息,但是我的页面现在加载速度非常慢,并且尝试快速加载让我感到困惑。
我有 Course、Person、CourseRole(学生、教师等)和 CourseSignup 模型,其中包括每个模型(Course、Person、CourseRole)。一切顺利。最近,我在 CourseRole 中设置了范围来定义注册的类别(我一直在硬编码角色名称,并希望摆脱它)。然后,我在 Course 中为每个类别设置了 has_many 关系。所以,Course 本质上是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.
此页面加载速度非常慢。我试图在查询中添加包含语句(基于 Bullet gem 的建议),但它实际上使它变慢了。这让我觉得我让这件事变得比我应该做的更复杂,但我不知道如何解决它。我想我应该重组我的模型。但我喜欢 scopes/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')
同样有效,但速度更慢。
【问题讨论】:
-
什么是
periods?您没有在描述中命名该关联,您的表上有索引吗?@cuco_session是什么?assigned_courses是做什么的?也许子弹的日志和您视图的一些代码 sn-p 可以提供帮助。 -
您需要提供更多信息才能获得更好的帮助 - 不清楚为什么在第二个查询示例中需要这么多表。每次执行包含时,您都在加入一个表,而表连接很昂贵。您想限制为此页面加载的表格数量。我不会有一个完整的“CourseRole”对象,除非它真的比单个字符串列有更多的信息。您应该查看 CourseSignup 的单表继承,其中“老师”和“学生”只是“类型”列中的不同值。这看起来应该只是@course.course_signups
标签: ruby-on-rails ruby scope include has-many