我们在以下范围内使用以下范围来订购我们的付款,这些付款具有"PAY9994","PAY9995","PAY9996"等字段"数字"。
scope :order_by_number, ->{order('number DESC')}
但我们意识到,在我们的付款号码越过"PAY9999"后,它将无法正常工作。如果它是一个纯粹的整数字符串,我本可以在范围下面使用,但是前缀"PAY"会产生问题。
scope :order_by_number, ->{order('number::integer DESC')}
有什么解决办法吗?
如果您能够,添加一个新列(带有索引(来表示order_number
并运行 rake 任务来回填数字并对其进行排序会更有效。
否则,您也可以先按长度排序,然后再按数量订购以使其正确订购
scope :order_by_number, ->{ order('length(number) DESC, number DESC') }
如果前缀始终相同,您可以将其修剪掉:
scope :order_by_number, ->{ order("trim(leading 'PAY' FROM number)::integer DESC") }
一旦确定这得到了您想要的顺序,您可能还需要添加与此表达式匹配的基于表达式的索引。这样,PostgreSQL将能够根据该索引对记录进行排序,而不必为每一行运行表达式。请参阅PostgreSQL手册以获取有关此方面的帮助。