首页 > 解决方案 > 字符串上的自定义顺序

问题描述

我有一个project模型。项目有一个code属性,其AAXXXX-YY格式类似于"AA0001-18", "ZA0012-19",其中AA是两个字符,XXXX是一个累进数字,并且YY是其创建年份的最后两位数字。

我需要定义一个默认范围,该范围code以年份优先于其他部分的方式对项目进行排序。假设我有代码"ZZ0001-17","AA0001-18""ZZ002-17","ZZ001-17"是第一、"ZZ002-17"第二和"AA001-18"第三。

我试过了:

default_scope { order(:code) }

但我是"AA001-18"第一个。

标签: ruby-on-railspostgresqlarel

解决方案


简短的回答

order("substring(code from '..$') ASC, code ASC")

等等,但为什么?

所以正如你所说,你想基本上按两件事排序:

  1. 代码字符串中的最后 2 个字符。YY
  2. 其余的代码AAXXXX-

所以首先,

根据 Rails文档的 order 函数将采用您添加的参数并在查询的 ORDER BY 子句中使用它们。

那么,根据PostgreSQL 的文档,子字符串函数是:

substring(string from pattern)

如果我们想要从我们使用的字符串末尾开始的2 个字符 .. $..$

因此,substring(code from '..$')

有关模式匹配的更多信息,请参阅此处的文档

现在最后,我们排序的第二部分code已经将作为所有前面字符的排序器AAXXXX-


推荐阅读