首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用has_many和scope优化页面加载

使用has_many和scope优化页面加载
EN

Stack Overflow用户
提问于 2019-09-07 11:32:52
回答 2查看 30关注 0票数 0

我是一个经验丰富的程序员,对ruby/rails和数据库比较陌生。我已经创建了一个用于注册课程的大型网站。我认为我使用scope和has_many创建课程注册类别是很聪明的。从逻辑上讲,它很好地封装了信息,但我的页面现在加载得非常慢,试图急切加载会让我感到困惑。

我有课程、人员、CourseRole (学生、教师等)和CourseSignup的模型,其中包括每个(课程、人员、CourseRole)中的一个。这一切都很顺利。最近,我在CourseRole中设置了作用域来定义注册的类别(我一直在对角色名称进行硬编码,并希望摆脱这种情况)。然后,我在课程中为每个类别设置has_many关系。所以,课程本身就是has_many course_signups的,并且有我的分类

代码语言:javascript
复制
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个类别)。我有一个页面,其中列出了所有课程和每个课程的所有注册。像这样:

代码语言:javascript
复制
Dodge Ball:
info about course
Students:
names of students
Teachers:
names of teachers
etc.

这个页面加载的速度非常慢。我试图将include语句添加到查询中(基于Bullet gem的建议),但这实际上会使查询速度变慢。这让我觉得我把事情搞得太复杂了,但我知道的还不够多,不知道如何修复它。我想我应该重组我的模型。但是我喜欢作用域/has_many的抽象

该页面是通过呈现显示一个课程的部分循环生成的。

代码语言:javascript
复制
@courses = @cuco_session.assigned_courses.includes(:period).order('periods.start_time')

有效,但速度非常慢。

代码语言:javascript
复制
@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')

也是有效的,但速度更慢。

EN

回答 2

Stack Overflow用户

发布于 2019-09-08 00:38:46

我们需要更多关于视图中实际发生的事情的信息,才能真正回答为什么你的页面速度很慢。

此外,还需要一个显示实际SQL的日志片段。

您提到刚开始通过Rails在线使用数据库。如果不深入研究其中一些模型的结构,就很难给出建议,但是您是否考虑过在Course和Person之间只使用一个连接表来替换CourseSignup?看起来这就是你要说的,但很难说清楚。

票数 0
EN

Stack Overflow用户

发布于 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*

上面的代码可以使用单个表继承进行重构

代码语言:javascript
复制
# 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表的引用放在课程角色表中

我希望上面的解决方案能对你的问题有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57830464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档