我有以下模型关联:一个学生模型和 has_many 分数。
我需要列出一个列表,显示他们的姓名和平均、最低、最高分数。到目前为止,我正在对每个学生使用 student.scores.average(:score),并且我意识到它正在为每个学生执行一个 sql。如何使用一个加入的 sql 创建列表?
另外我将如何将它与 Will_Paginate 插件一起使用?
谢谢
我有以下模型关联:一个学生模型和 has_many 分数。
我需要列出一个列表,显示他们的姓名和平均、最低、最高分数。到目前为止,我正在对每个学生使用 student.scores.average(:score),并且我意识到它正在为每个学生执行一个 sql。如何使用一个加入的 sql 创建列表?
另外我将如何将它与 Will_Paginate 插件一起使用?
谢谢
您想要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
到您的参数中