2

我有以下模型关联:一个学生模型和 has_many 分数。

我需要列出一个列表,显示他们的姓名和平均、最低、最高分数。到目前为止,我正在对每个学生使用 student.scores.average(:score),并且我意识到它正在为每个学生执行一个 sql。如何使用一个加入的 sql 创建列表?

另外我将如何将它与 Will_Paginate 插件一起使用?

谢谢

4

1 回答 1

1

您想要Student.find的:group和选项。:select这应该适合你:

students = Student.all(
  :select => "
    students.*,
    AVG(scores.score) as avg_score,
    MIN(scores.score) as min_score,
    MAX(scores.score) as max_score",
  :joins => :scores
  :group => 'students.id')

计算的列就像真实的列一样可用,尽管它们显然不会被保存

students.first.avg_score
students.first.min_score
students.first.max_score

要使用 WillPaginate,只需包含您的 :page, :per_page, ... 选项并调用Student.paginate而不是find. 如果事实证明分页由于该选项而获得错误的页数:group,只需将以下内容添加:total_entries => Student.count到您的参数中

于 2010-03-29T05:35:13.040 回答