Это вытяжка concern-а отвечающего за сортирову товаров в различных категориях через позицию в hstore применяемыую в проекте http://kiiiosk.ru/
За основу был взят код из модуля https://github.com/mixonic/ranked-model
- Плохой код, не используемый повторно.
- Многие процедуы не оптимизированы.
- Путаница в терминах.
- Возможность применять concern для других моделей (не только product), указывать название поля для сортировки (
category_positions
) и scope-поля (by_category_id
), в общем сделать модуль которым можно пользоваться и в других проектах. - Минимум SQL запросов при сохранении.
- Колбеки при пересортировке (например у нас все товары отражаются в elasticsearch и при массовом изменении позиции необходимо также массово обновлять товары в elastic).
- Если товар добавляется в категорию у него автоматически должен появиться порядок. Бывает так, что товар в категорию добавили, но позицию не установили, в итоге это ломает сортировку.
- Защита от случаев когда у товаров нет значения сортировки (в этом случае они должны появиться), см предыдующий пункт.
- Возможность узнать порядковое значение товара.
- Тесты перевести на minitest.
- Используем SOLID, делим код на объекты.
- А можно сделать это по другому? Например на
plpgsql
? - Да, конечно! - Почему за пример выбран именно
ranked-model
а неacts_as_*
. - Потому что она не требует пересортировки всех позиций при смене позиции только у одной записи.
- Для начала нужно настроить окружение и запустить те тесты что уже есть. Они должны проходить.
- Разбить задачу на несколько этапов, описать порядок разработки и сроки.
- rank - порядковое значение товара (0,1,2,3,4)
- position - raw-значение позиции в списке (-10000, -5000, 0, 5000, 10000)
См пример: