Как упорядочить по целому значению строки в рубине? - PullRequest
0 голосов
/ 06 октября 2018

Мы использовали приведенную ниже область для заказа наших Платежей, у которых есть поле 'номер' типа "PAY9994", "PAY9995", "PAY9996" и т. Д.

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

Но мы поняли, что этоне будет работать после того, как наш номер платежа пересекает "PAY9999".Я мог бы использовать приведенную ниже область, если бы это была просто строка целых чисел, но префикс «PAY» создает проблемы.

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

Любое решение?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Если вы в состоянии, было бы гораздо эффективнее добавить новый столбец (с индексом), чтобы обозначить order_number, и вместо этого запустить грабли, чтобы заполнить числа и порядок на них.

В противном случае вы также можете заказать сначала по длине, а затем по номеру, чтобы получить его правильно

scope :order_by_number, ->{ order('length(number) DESC, number DESC') }
0 голосов
/ 06 октября 2018

Если префикс всегда один и тот же, вы можете его обрезать:

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

Как только вы убедитесь, что это дает вам нужный вам порядок, вы, вероятно, захотите добавить выражениеиндекс, соответствующий этому выражению.Таким образом, PostgreSQL сможет упорядочивать ваши записи на основе этого индекса, и ему не нужно будет запускать выражение для каждой строки.См. Руководство PostgreSQL для получения справки по этому вопросу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...