You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails应用编写ActiveRecord查询获取学生未作答的Checkup试题

解决方案

方案1:左连接查询(性能最优,推荐大数据量场景)

直接通过数据库左外连接一次性过滤结果,避免多次查询或传递大量id数组:

def exams
  # 假设你已通过身份验证组件(如Devise)获取到当前登录用户对象current_user
  @next_checkup = Checkup.left_joins(:answers)
                         .where(answers: { user_id: current_user.id, id: nil })
                         .order(release_at: :asc) # 可替换为你的业务排序规则,比如按发布时间从小到大取最早的未答测试
                         .take
end

逻辑说明:

  • left_joins(:answers) 会将Checkup全量和对应的Answer做左外连接,没有对应Answer的Checkup也会保留
  • where(answers: { user_id: current_user.id, id: nil }) 过滤出当前用户没有对应Answer记录的Checkup,就是未作答的测试

方案2:子查询排除(写法直观,适合小数据量场景)

如果你的应用用户答题量不大,这种写法可读性更高:

def exams
  answered_checkup_ids = current_user.answers.pluck(:checkup_id)
  @next_checkup = Checkup.where.not(id: answered_checkup_ids)
                         .order(release_at: :asc)
                         .take
end

补充说明

  • 如果不存在未作答的Checkup,@next_checkup 会返回nil,建议在视图层添加空值判断,展示「暂无新测试」类的提示
  • 排序规则可根据你的业务调整,比如需要优先推送最新发布的测试,把order条件改为order(created_at: :desc)即可

内容的提问来源于stack exchange,提问作者C.Graco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 19:27:03