Как проинкрементировать поле в таблице по юзерам?

Пытаюсь сделать закладки с возможностью менять порядок. Есть users со связью один ко многим к bookmarks.

Добавил целочисленное поле priority к bookmarks.

Как в миграции проинкрементировать поле в общей куче примерно понимаю:

Bookmark.update_all('priority = priority + 1')

или

ActiveRecord::Base.transaction do
  ActiveRecord::Base.connection.execute('SET @pri := 0;')
  ActiveRecord::Base.connection.execute('UPDATE bookmarks SET priority = ( SELECT @pri := @pri + 1 ) ORDER BY updated_at ASC;')
end


Что даст следующее:

bookmarks:

user_id: 1, priority:1
user_id: 2, priority:2
user_id: 1, priority:3
user_id: 2, priority:4


А как сделать так чтобы поле было проинкрементировано по пользователю? Т.е. чтобы получить:

bookmarks:
user_id: 1, priority:1
user_id: 2, priority:1
user_id: 1, priority:2
user_id: 2, priority:2


База большая поэтому ищу решение с максимальным использованием средств бд(Mysql).
  • Вопрос задан
  • 65 просмотров
Решения вопроса 2
DexterHD
@DexterHD
Software Engineer, Teamlead, CTO
1) Извлекаем всех пользователей.
2) Для каждого пользователя пробегаемся по закладкам и назначаем приоритет

Если честно, не понятно зачем искать решение средствами БД. Если БД действительно огромная (Гб/Тб данных) то запускаем 2 шаг. в несколько потоков.
Ответ написан
Комментировать
POS_troi
@POS_troi
СадоМазо Админ, флудер, троль.
В один запрос и красиво не выйдет, придёться для каждого юзера отдельно проводить, но так как операция одноразовая то не вижу никаких проблем это сделать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@man_without_face
студент
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы