所以我有四个表,users
,courses
,projects
和grades
。 courses
有许多projects
,其中有许多grades
。我不能给整个课程,但这里有适当的关联。
class Course < ActiveRecord::Base
has_many :projects
end
class Project < ActiveRecord::Base
belongs_to :course
has_many :grades
end
class Grade < ActiveRecord::Base
belongs_to :project
belongs_to :user
end
class User < ActiveRecord::Base
has_many :grades
end
我想列出所有课程,在每门课程中我都能看到他们所有的项目,以及每个项目的成绩。 (请记住,我在这里给你的是从我的实际项目中简化的。)
显然我应该使用include()语句来尽可能提高效率。这就是它的样子:
Course.includes(projects: [:grades]).all
这为我提供了三个小而有效的查询之间的课程,项目和成绩。这正是我想要的,但这里的杀手问题是我只想要当前用户的成绩。所以我通常会去
Course.includes(projects: [:grades]).where(grades: [user_id: current_user.id])
但是,这会将快速细长的三个查询转换为一个具有多个连接的大型慢速查询。通常情况下这是可以的,但在我的实际实现中,查询中还有更多内容,并且添加更多连接会使一个查询的运行时爆炸。 所以我希望将它分解为较小的查询,这样将成绩和项目的where语句添加到他们的查询中,而不是抛入一个巨大的连接。有没有办法做到这一点?