当代码比言语更好:
[4] pry> Models::Company.order(:name).select_map(:name)
=> ["Dekker, Jacobs and Bosch", "Koster en Zonen", "Peters-Koster", "Peters, Vries and Smits", "Wal, Linden and Jacobs"]
[5] pry> Models::Company.order(:name).select_map(:name).sort
=> ["Dekker, Jacobs and Bosch", "Koster en Zonen", "Peters, Vries and Smits", "Peters-Koster", "Wal, Linden and Jacobs"]
因此我的规格随机失败。我可以在比较之前规范化数组,如下所示:
result_names.map { |s| s.gsub(/,|-/, '') }
我尝试在JavaScript中对相同的数组进行排序,并得到了与Ruby给我相同的结果。我现在想知道,是否有某种排序字符串的标准,还是实现的细节?
答案 0 :(得分:3)
基于ASCII码对ruby中字符串的行为进行排序。
pg中文本的排序行为取决于您的语言环境的当前排序规则。来自PostgreSQL wiki - Why do my strings sort incorrectly?:
它不是ASCII /字节顺序。不,它不是,它不应该是。 ASCII是一种编码,而不是排序顺序。如果你想要这个,你可以使用 C语言环境,但是你可以使用非ASCII字符的功能。
因此,在纯SQL中按ASCII值排序,而不是按照本地语言规则进行正确的本地化排序,您可以在查询中使用COLLATE子句
order by name COLLATE "C" ASC
您可以使用SHOW lc_collate;
检查psql中的整理设置。
PostgreSQL使用操作系统归类支持,因此结果可能会因主机操作系统与主机操作系统略有不同而异。某些版本的Mac OS X或BSD系列操作系统在区域设置定义方面存在问题。