Size: a a a

2021 July 22

SU

Serg Udo in RubyRush.ru
источник

PK

Pavel Kleimenov in RubyRush.ru
лучше не используй поле type, это зарезервированное название и прийдется потом в модели делать донастройку

P.S. 1 строчка, но все же
источник

АП

Алексей Печерский... in RubyRush.ru
большое спасибо!)
источник

АП

Алексей Печерский... in RubyRush.ru
тз не отменишь... но спасибо за совет
источник

PK

Pavel Kleimenov in RubyRush.ru
ну тогда держи))
self.inheritance_column = :_type_disabled
это в модель
источник

АП

Алексей Печерский... in RubyRush.ru
круто, спасибо)
источник

АЖ

Александр Жуков... in RubyRush.ru
Всем привет! Ребятки, кто знает, подскажите плез. Задача:
есть список людей, который должны отображаться в определенном порядке (условно по крутости занимаемой должности), этот порядок задается пользователем на фронте через драг&дроп. Как на бэке реализовать храниние этих позиций, чтобы при добавлении или каких-то изменений не летело куча запросов на обновление позиции +1 у каждого кто ниже по списку? Может гем есть какой-то для таких случаев? Спасибо!
источник

СР

Сі Рожа in RubyRush.ru
Связный список🤔?
Каждый элемент списка хранит ссылку на предыдущий и следующий элемент
источник

ДК

Денис Клименко... in RubyRush.ru
Привет

я бы наверное реализовал это так

для каждого чела завел свойство например sort_order или sort_position, в котором хранил вещественное число, по которому сортировал бы коллекцию

пример массива со списком людей:

people = [
 {name: "Андрей", sort_order: 1.0},
 {name: "Денис", sort_order: 2.0},
 {name: "Мария", sort_order: 3.0},
 {name: "Александр", sort_order: 4.0}

]

Допустим хочу переместить Александр между Андреем и Денисом, тогда для Александр нужно в свойство sort_order назначит такое число, которое будет больше чем sort_order Андрея и меньше sort_order Дениса.

Как найти это число?

Ну например можно от sort_order Денис отнять sort_order Андрея, и разделить на 2, затем прибавить это к sort_order Андрея

(2 - 1) / 2 + 1 = 1.5

Получим в результате

[
 {name: "Андрей", sort_order: 1.0},
 {name: "Денис", sort_order: 2.0},
 {name: "Мария", sort_order: 3.0},
 {name: "Александр", sort_order: 1.5}


]

А уже при выводе списка людей применяем сортировку


people.sort { |p1,p2| p1[:sort_order] <=> p2[:sort_order] }
источник

ДК

Денис Клименко... in RubyRush.ru
если данные хранятся в базе то sort_order это будет столбец в базе. после того как юзер у вас переместил какого то чела, то можно делать запрос на бэк, чтобы бэк обновил sort_order в базе для перемещенного чела.
источник

ДК

Денис Клименко... in RubyRush.ru
также можно думаю как то кэшировать на фронте обновления, например не на каждое перемещение слать запрос, а ждать например 5 сек, и накапливать изменения, а затем слать в бэк, чтобы он разом обновил несколько записей в бд
источник

Э

Эдем in RubyRush.ru
Например, гемы acts_as_list или awesome_nested_set
Оба хранят в таблицах номера позиций и при отправке запроса при драг-н-дропе обновляют поля
ЕМНИП одним запросом все позиции обновляются
источник

АЖ

Александр Жуков... in RubyRush.ru
Друзья, спасибо всем большое за помощь! Оч круто!!!
источник

ДК

Денис Клименко... in RubyRush.ru
а если записей миллионы, и я переместил один item, это получается очень медленно, я так понимаю
источник

Э

Эдем in RubyRush.ru
Пожелаю удачи тому, кто тянет драг-н-дропом с миллионной позиции на первую
источник

ДК

Денис Клименко... in RubyRush.ru
😂но помимо драг-н-дропа, может быть кнопочка с инпутом, типо на сколько вниз по списку или вверх перенести, или просто кнопка перенести в конец или начало
источник

PK

Pavel Kleimenov in RubyRush.ru
как по мне проще добавить поле типу order_previous_user_id и там хранить ид предыдущего в списке, соответственно при перетягивании с 1_000_000 на 3, нужно будет всеголишь обновить 2 записи:
ту что была миллионной и ту что была раньше на 3 месте
источник

PK

Pavel Kleimenov in RubyRush.ru
ток над названием подумать надо, то как я его назвал, плохой пример
источник

Э

Эдем in RubyRush.ru
В awesome_nested_set это так и работает, там обновляются поля lft в изменённых позициях
источник

PK

Pavel Kleimenov in RubyRush.ru
а еще лучше делать это вообще не в таблице юзеров
источник