Упорядочивать элементы по sizename, когда это не по логике? - PullRequest
1 голос
/ 26 июня 2019

В моем приложении администратор может добавлять размеры к своим продуктам в этом порядке.

  • Variant.create(size_name: "L")
  • Variant.create(size_name: "S")
  • Variant.create(size_name: "XXL")
  • Variant.create(size_name: "XL")

Размеры также могут быть (30,24, 33, 31, 29)

В моем представлении продукта тег выбора отображается в том порядке, в котором он был создан. Я хотел бы отсортировать от самого маленького размера до самого большого (S, M, L ...). С числовыми размерами я могу заказать от самого маленького до самого большого, это хорошо

Как мне сделать так, чтобы оба размера (в числовом и в алфавитном порядке) могли быть отсортированы от наименьшего к наибольшему?

Ответы [ 2 ]

3 голосов
/ 26 июня 2019

Есть много способов решить эту проблему, но в основе любого решения вам нужно определить порядок вручную (или использовать стороннюю библиотеку, которая уже написала этот ручной порядок для вас?).

Например, вы можете где-нибудь определить, например,

SIZE_NAMES = %w[XS S M L XL XXL]

, а затем в другом месте кода использовать что-то вроде:

variants.sort_by { |variant| SIZE_NAMES.index(variant.size) }

Для более «продвинутого» решениявместо этого вы можете рассмотреть возможность определения каждого размера как пользовательский объект , а не как обычный String.Взгляните на модуль Comparable и оператор <=> ("космический корабль").

Используя это, вы можете реализовать его таким образом, что, например, variants.sort автоматически сравнивает варианты по их «преобразованному» размеру и упорядочивает их так, как вы ожидаете.

2 голосов
/ 26 июня 2019

Если вы хотите выполнить сортировку на стороне базы данных, у вас есть два варианта:

  1. Предопределенная сортировка, например, так:

    Variant.order(
     "CASE size_name
        WHEN 'S' THEN 1
        WHEN 'L' THEN 2
        WHEN 'XL' THEN 3
        WHEN 'XXL' THEN 4
        ELSE 10
      END, size, id"
    )
    

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

  2. с перечислениями активных записей :

    enum size_name: { s: 0, l: 1, xl: 2, xxl: 3 }
    

    Таким образом, вы все равно можете назначить поле строкой / символом, но базовые данные на самом деле будут целыми числами, поэтому вы можете просто использовать order(:size_name, :size) для сортировки по size_name и size.

    Также таким образом вы можете добавить индекс для ускорения заказа

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