gpt4 book ai didi

ruby-on-rails - Rails 查询 has_many 关联记录之间的差异

转载 作者:行者123 更新时间:2023-11-29 13:45:09 24 4
gpt4 key购买 nike

我有一个名为 Student 的模型,它有 has_many Test。每个 Test 都有一个名为 mark 的列。我愿意

  • 根据最高平均考试成绩查询和排序学生
  • 根据第一次和最后一次测试之间的最大差异查询和排序学生(假设分数在增加)
  • 根据两次测试之间的差异查询和排序学生

我卡在了为测试标记创建选择查询的部分。

最佳答案

我认为提供原始 SQL 查询会更容易,因此对于第一个任务,我假设此查询应该有效

SELECT students.*, AVG(COALESCE(tests.mark, 0)) as avg_mark FROM students LEFT OUTER JOIN tests ON students.id = tests.student_id GROUP BY students.id ORDER BY avg_mark

对于第二个任务,我使用了 this帖子,我认为它应该可以,但没有检查

SELECT students.*, MIN(LAG(COALESCE(tests.mark, 0)) OVER (ORDER BY tests.mark) as mark_diff) as min_mark FROM students LEFT OUTER JOIN tests ON students.id = tests.student_id GROUP BY students.id ORDER BY min_mark

我没有完全理解最后一个任务。我假设这是学生测试之间的最大差异

SELECT students.*, MIN(LAG(COALESCE(tests.mark, 0)) OVER (ORDER BY tests.mark) as mark_diff) as min_mark FROM students LEFT OUTER JOIN tests ON students.id = tests.student_id GROUP BY students.id ORDER BY min_mark

为了让它更像 rails 方式,试试这个:

Student.select('students.*, MIN(LAG(COALESCE(tests.mark, 0)) OVER (ORDER BY tests.mark) as mark_diff) as min_mark').joins('LEFT OUTER JOIN tests ON students.id = tests.student_id').group('students.id').order('min_mark')

但是在聚合函数之后,您将无法向结果关系添加任何范围。您可以尝试对其进行两次查询,为结果提供 id 列表

scope :my_scope, -> { ids = my_request.pluck(:id); where(id: ids) }

可能的陷阱在于最大查询大小。

关于ruby-on-rails - Rails 查询 has_many 关联记录之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49767606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com