ruby-on-rails - 字符串上的自定义顺序
问题描述
我有一个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 个字符。
YY
- 其余的代码
AAXXXX-
所以首先,
根据 Rails文档的 order 函数将采用您添加的参数并在查询的 ORDER BY 子句中使用它们。
那么,根据PostgreSQL 的文档,子字符串函数是:
substring(string from pattern)
如果我们想要从我们使用的字符串末尾开始的2 个字符 ..
$
..$
因此,substring(code from '..$')
有关模式匹配的更多信息,请参阅此处的文档。
现在最后,我们排序的第二部分code
已经将作为所有前面字符的排序器AAXXXX-
。
推荐阅读
- swift - 使用 collectionView 创建菜单页面
- typescript - 如何正确扩展数组的泛型返回类型
- javascript - 如何为根组件 dom 元素添加样式(角度选择器组件)
- python-3.7 - Python 中的 SQL:如何调试/打印带有变量 (%s) 的 sql 查询
- javascript - 具有两个非常相似的数组的对象,一个显示另一个不显示
- sharepoint - Microsoft Stream 视频嵌入代码在 IE 10、11 中不起作用
- linux - 如何根据ips、domain和url过滤apache访问日志?
- python - 使用 Pandas-Datareader 为 Yahoo 导入时收到“未来警告”
- flutter - Flutter dio 图像上传不工作引发服务器 500 错误,但在邮递员中工作
- android - 工具栏盲片