我们正在使用以下范围对付款进行排序,这些付款的“数字”字段为“ PAY9994”,“ PAY9995”,“ PAY9996”等。
scope :order_by_number, ->{order('number DESC')}
但是我们意识到,当我们的付款号码越过“ PAY9999”后,它将无法正常工作。我本可以在以下范围内使用,如果它是纯整数字符串,但是前缀“ PAY”会造成问题。
scope :order_by_number, ->{order('number::integer DESC')}
有解决方案吗?
答案 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以获得帮助。