ActiveRecord查询如何实现指定ID或列值优先排序,其余记录正常排序
实现方案
你可以通过自定义排序权重的方式实现需求,Rails不同版本有不同的简便写法:
Rails 6+ 版本(推荐写法)
Rails 6 之后官方新增了in_order_of方法,专门用于处理指定值优先排序的场景:
# 将 ModelName 替换为你的实际模型类名 # 后面的 order 规则保持你原来的排序逻辑即可,示例是id升序 ModelName.in_order_of(:id, [3, 5]).order(:id)
执行后直接就能得到你需要的顺序:[id:3, id:5, id:1, id:2, id:4, id:6]
低于Rails 6的旧版本
手动写CASE语句自定义排序权重即可,原理是给需要前置的记录分配更小的排序优先级值:
# 给id=3分配权重1,id=5分配权重2,其余记录权重都是3,先按权重升序再按原有规则排序 ModelName.order(Arel.sql("CASE id WHEN 3 THEN 1 WHEN 5 THEN 2 ELSE 3 END, id ASC"))
动态指定前置ID的兼容写法
如果前置的ID是动态生成的,可以用通用写法适配任意长度的前置ID数组:
top_ids = [3,5] # 可以替换为任意动态ID数组 # 生成CASE排序规则 weight_sql = Arel.sql( "CASE id #{top_ids.map.with_index{|id, idx| "WHEN #{id.to_i} THEN #{idx+1}"}.join(" ")} ELSE #{top_ids.size + 1} END" ) # 后面的order规则保持你的原有排序逻辑即可 ModelName.order(weight_sql).order(:id)
内容的提问来源于stack exchange,提问作者sclem72
相关产品推荐
相关产品推荐

