Rails:如何按关联模型带条件字段对Unit模型排序?
解决Unit按未关闭反馈数量排序的问题
我来帮你搞定这个排序需求!你的核心目标是统计每个Unit关联的**未关闭反馈(feedback.result IS NULL)**数量,按该数量降序排列,无未关闭反馈的Unit统一排在列表底部。之前的尝试没成功是因为分组和统计逻辑没找对,下面是完全符合要求的实现方案:
正确的查询代码
Unit.left_joins(:feedbacks) .select('units.*, COUNT(CASE WHEN feedbacks.result IS NULL THEN 1 END) AS open_feedbacks_count') .group('units.id') .order('open_feedbacks_count DESC, units.id ASC')
代码逻辑拆解
让我逐个解释每个部分的作用:
left_joins(:feedbacks):用左连接确保所有Unit都被纳入结果,哪怕某个Unit没有任何关联的Feedback,不会丢失数据。select子句:通过CASE表达式精准统计未关闭反馈数——仅当feedbacks.result IS NULL时返回1,否则返回NULL;而COUNT函数会自动忽略NULL值,最终open_feedbacks_count就是该Unit的未关闭反馈总数。group('units.id'):按Unit的ID分组,保证每个Unit的统计结果独立,不会把多个Unit的反馈数量混算。order子句:先按open_feedbacks_count降序,让未关闭反馈多的Unit排在最前面;后面的units.id ASC是可选的,用来保证无未关闭反馈的Unit之间排序稳定(你也可以换成units.name等其他字段,按需调整即可)。
为什么之前的代码无效?
你之前的group('feedbacks.result IS NULL')会把所有Unit粗暴分成两组(有未关闭反馈/无未关闭反馈),而非按单个Unit统计数量;同时COUNT(feedbacks.result IS NULL)的统计逻辑也无法正确计算每个Unit的未关闭反馈数,这两个问题导致了排序失败。
这个查询是单个SQL查询,返回的是ActiveRecord::Relation,完全满足你的要求~
内容的提问来源于stack exchange,提问作者demir
相关产品推荐
相关产品推荐

