字符串的自定义顺序

Custom order on string

我有一个 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"

简答

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

等等,为什么?

正如您所说,您基本上希望按 2 项进行排序:

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

所以首先要做的是,

按照 Rails documentation 的排序函数将采用您添加的参数并将它们用于查询的 ORDER BY 子句中。

那么,根据documentation of PostgreSQL的子串函数为:

substring(string from pattern)

如果我们想要 2 个字符 .. 来自字符串的 末尾 $ 我们使用 ..$

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

更多关于模式匹配的信息请参考documentation here

最后,在我们排序的第二部分 code 中,它已经充当所有前面字符 AAXXXX-.

的排序器