Preload workshop_host in DashboardQuery.upcoming_events_for_user (per-workshop N+1 on /dashboard)

未关闭 适合新手
#3,070 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

维护者通常 1 天内回复

@davidmillen50 已经在做这个了。

开始于 2026年11月2日。

  • #3074 来自 @davidmillen50 —— 未关闭

评估

难度
2/5
预计耗时
1-3 小时
新手友好度
82/100
Issue 类型
重构
描述清晰度
描述清楚
活跃度
活跃
技术栈
rails, ruby
领域
backend, database

调研方向

从 app/queries/dashboard_query.rb 约第 27-40 行开始,那里的 upcoming_events_for_user 使用了 eager_load(:sponsors),但没有加载工作坊主办方。检查 Workshop#host 如何遍历 workshop_host 和 sponsor,以及 PR #3066 是如何添加其 preload 的。在现有 join 旁添加 preload(workshop_host: :sponsor),并按 issue 的提醒,将 :workshop_host 保留在 eager_load 之外。当 /dashboard 的查询数量不再随工作坊数量增长时,即为完成。

由索引模型根据 Issue 内容生成。

描述

performance

DashboardQuery.upcoming_events_for_user runs one workshop_host lookup per workshop on every /dashboard render. Give it the same treatment as PR #3066: keep :sponsors in the join and add preload(workshop_host: :sponsor).

  • app/queries/dashboard_query.rb:27-40 eager_loads :sponsors but never loads :workshop_host
  • Workshop#host lazy-loads through workshop_host&.sponsor, so each card costs up to two extra queries — up to 2 × DashboardQuery::MAX_WORKSHOP_QUERY per render
  • The dashboard action renders the same EventCardComponent → WorkshopPresenter#venue → model.host path that PR #3066 fixed for the homepage
  • Do not add :workshop_host to the eager_load list: sharing the workshop_sponsors join alias is the #2975 host-loss trap

Raised from the review of PR #3066; the gap predates that PR.

主要语言
Ruby
星标
106
派生
208
平均合并
19 小时 51 分钟
30 天内合并 PR
57

环境准备

  • 提供 Dockerfile 或 Docker Compose 文件
  • 没有 Pull Request 模板
  • 阅读贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

codebar/planner 的其他 Issue

查看 codebar/planner 的全部 Issue

相似的 Issue

更多 Ruby Issue

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。