AR эквивалентно этим операторам SQL или как иначе использовать их в Rails?

Я хотел использовать драгоценный камень act_as_list, чтобы изменить порядок списков.

Но, похоже, он не обрабатывает более ограниченные запросы, чем основанные на ассоциации (я хочу упорядочить списки, основанные как на ассоциации, так и на объектах с логическим атрибутом, установленным в true).

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

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

Эти два следующих утверждения перемещают объект вопроса с позиции 3 на 8.

UPDATE "questions" SET position = (position - 1) WHERE ("questions"."question_list_id" = 2 AND position > 3 AND position <= 8)
UPDATE "questions" SET "position" = ?, "updated_at" = ? WHERE "questions"."id" = 55  [["position", 8], ["updated_at", "2014-06-09 14:40:47.545040"]]

Возможно ли с ActiveRecord или любым другим способом, и если да, то как, повторно использовать вышеуказанный код?

1 ответ

Решение

Вы можете смешивать SQL и ActiveRecord для достижения этих операторов SQL. Они могут быть написаны:

Question.where(question_list_id: 2, position: [4..8]).update_all('position = (position - 1)')
Question.update(55, position: 8)

Драгоценный камень act_as_list не отвечает за сортировку элементов, он просто сохраняет в БД положение элементов. Вы можете отсортировать элементы с помощью API, предоставленного act_as_list.

Также есть scope вариант, если вы хотите нацелить только некоторые элементы. Смотрите источник.

Другие вопросы по тегам