如何按红宝石中字符串的整数值排序?



我们在以下范围内使用以下范围来订购我们的付款,这些付款具有"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手册以获取有关此方面的帮助。

最新更新