自定义字符串顺序

时间:2018-07-18 22:39:52

标签: ruby-on-rails postgresql arel

我有一个project模型。项目具有code属性,格式为AAXXXX-YY,例如"AA0001-18""ZA0012-19",其中AA是两个字符,XXXX是渐进式数字,YY是其创建年份的最后两位数字。

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

我尝试过:

default_scope { order(:code) }

但是我先得到"AA001-18"

1 个答案:

答案 0 :(得分:1)

简短答案

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

等等,为什么?

因此,正如您所说的,您基本上希望按两件事进行排序:

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

那么首先要做的是

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

然后,根据documentation of PostgreSQL的子字符串函数为:

substring(string from pattern)

如果我们要从字符串的末端起 2个字符 .. $,请使用..$

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

有关模式匹配的更多信息,请参阅documentation here

现在,最后,我们对code进行排序的第二部分已经对所有前面的字符AAXXXX-进行了排序。