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
相关产品推荐
相关产品推荐

