字符串的自定义顺序
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 项进行排序:
- 代码字符串中的最后 2 个字符。
YY
- 其余代码
AAXXXX-
所以首先要做的是,
按照 Rails documentation 的排序函数将采用您添加的参数并将它们用于查询的 ORDER BY 子句中。
那么,根据documentation of PostgreSQL的子串函数为:
substring(string from pattern)
如果我们想要 2 个字符 ..
来自字符串的 末尾 $
我们使用 ..$
因此,substring(code from '..$')
更多关于模式匹配的信息请参考documentation here。
最后,在我们排序的第二部分 code
中,它已经充当所有前面字符 AAXXXX-
.
的排序器
我有一个 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 项进行排序:
- 代码字符串中的最后 2 个字符。
YY
- 其余代码
AAXXXX-
所以首先要做的是,
按照 Rails documentation 的排序函数将采用您添加的参数并将它们用于查询的 ORDER BY 子句中。
那么,根据documentation of PostgreSQL的子串函数为:
substring(string from pattern)
如果我们想要 2 个字符 ..
来自字符串的 末尾 $
我们使用 ..$
因此,substring(code from '..$')
更多关于模式匹配的信息请参考documentation here。
最后,在我们排序的第二部分 code
中,它已经充当所有前面字符 AAXXXX-
.