如何在ruby中按字符串的整数值排序?

时间:2018-10-06 10:08:26

标签: sql ruby-on-rails ruby postgresql ruby-on-rails-5

我们正在使用以下范围对付款进行排序,这些付款的“数字”字段为“ PAY9994”,“ PAY9995”,“ PAY9996”等。

scope :order_by_number, ->{order('number DESC')}

但是我们意识到,当我们的付款号码越过“ PAY9999”后,它将无法正常工作。我本可以在以下范围内使用,如果它是纯整数字符串,但是前缀“ PAY”会造成问题。

scope :order_by_number, ->{order('number::integer DESC')}

有解决方案吗?

2 个答案:

答案 0 :(得分:2)

如果可以的话,添加一个新列(带有索引)来表示order_number并运行rake任务以回填数字并以此排序将是更加高效的方式。

否则,您也可以先订购长号,然后订购号,以便正确订购

scope :order_by_number, ->{ order('length(number) DESC, number DESC') }

答案 1 :(得分:1)

如果前缀始终相同,则可以将其修剪掉:

scope :order_by_number, ->{ order("trim(leading 'PAY' FROM number)::integer DESC") }

一旦确定这可以使您获得所需的顺序,您可能还需要添加与该表达式匹配的基于表达式的索引。这样,PostgreSQL将能够基于该索引对您的记录进行排序,而不必为每一行运行该表达式。请参见PostgreSQL manual以获得帮助。