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

Rails 5+PostgreSQL:按created_at排序且base_price为nil的记录后置

解决Rails 5 + PostgreSQL中Service模型的排序需求

嘿,我明白你要的排序逻辑了——先把有base_price的记录按创建时间倒序排前面,base_price为nil的统一放后面,而且后面这部分也要按创建时间倒序。你之前的写法没达到预期,是因为排序的优先级逻辑没搞对,咱们来调整一下:

正确的排序代码

在Rails里可以借助PostgreSQL的CASE语句来实现分组排序,代码如下:

Service.order(
  "CASE WHEN base_price IS NOT NULL THEN 0 ELSE 1 END ASC",
  "created_at DESC"
)

逻辑解释

  • 第一部分排序规则:用CASE把有base_price的记录标记为0,为空的标记为1,然后按ASC升序排列,这样0(有值的)就会全部排在1(空值的)前面。
  • 第二部分排序规则:在同一分组里(不管是有值还是空值的组),都按created_at DESC倒序排列,保证每组内都是最新创建的记录在前。

为什么你之前的写法没用?

你之前写的Service.order('created_at DESC, base_price NULLS LAST'),逻辑是先按创建时间倒序,只有当两条记录创建时间相同时,才把base_price为空的放后面,这和你要的「所有空值记录统一放底部」的需求不符,所以达不到预期效果。

内容的提问来源于stack exchange,提问作者Kathan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:42:30