Обновите все записи, соответствующие некоторым условиям, но сохраняя «индексированные по позиции» значения в столбце таблицы базы данных. - PullRequest
3 голосов
/ 14 июля 2011

Я использую Ruby on Rails 3.0.7 и у меня есть столбец таблицы базы данных position для обработки сортируемого списка записей.Я хотел бы обновить этот столбец для всех записей, соответствующих некоторым условиям, при уничтожении записи, значение которой position находится «в середине всех значений позиции», но сохраняя порядок (численно) в столбце position.

То есть, например, если в следующем списке объектов класса я уничтожу запись с position 3 и user_id 1

#<Article id: 1, position: 1, user_id: 1>,
#<Article id: 2, position: 1, user_id: 2>,
#<Article id: 3, position: 2, user_id: 1>,
#<Article id: 4, position: 3, user_id: 1>,
#<Article id: 5, position: 1, user_id: 3>,
#<Article id: 6, position: 4, user_id: 1>,
#<Article id: 7, position: 5, user_id: 1>,
#<...> # A lot of others records having 'user_id' = 1

Я хотел бы обновить все другие записи, связанные с user_id 1 , чтобы иметь

#<Article id: 1, position: 1, user_id: 1>,
#<Article id: 2, position: 1, user_id: 2>,
#<Article id: 3, position: 2, user_id: 1>,
#<Article id: 5, position: 1, user_id: 3>,
#<Article id: 6, position: 3, user_id: 1>,
#<Article id: 7, position: 4, user_id: 1>,
#<...> # A lot of others records having 'user_id' = 1

Конечно, все это относится к производительности.

Как я могу это сделать (может быть, в одном предложении \ инструкции) ?


Я знаю, что метод update_all может как-то помочь, но я не знаю, как автоматически увеличить position значения, используя это.

1 Ответ

4 голосов
/ 14 июля 2011

Я думаю, что вы ищете в SQL это?

update articles set position = position - 1 
       where position > pos_of_deleted and user_id = uid_of_deleted

С update_all он должен преобразоваться во что-то вроде этого:

Article.update_all("position = position - 1", 
                   ["position > ? and user_id = ?", 
                    pos_of_deleted, uid_of_deleted])

Это подтянет все позиции выше удаленной позиции на одну ступеньку вниз.

...