我有一个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"
。
答案 0 :(得分:1)
order("substring(code from '..$') ASC, code ASC")
因此,正如您所说的,您基本上希望按两件事进行排序:
YY
AAXXXX-
那么首先要做的是
Rails documentation中的order函数将采用您添加的参数,并在查询的ORDER BY子句中使用它们。
然后,根据documentation of PostgreSQL的子字符串函数为:
substring(string from pattern)
如果我们要从字符串的末端起 2个字符 ..
$
,请使用..$
因此,substring(code from '..$')
有关模式匹配的更多信息,请参阅documentation here。
现在,最后,我们对code
进行排序的第二部分已经对所有前面的字符AAXXXX-
进行了排序。