Поле прироста массы на 1

У меня есть запрос update deals set count = count + 1. В Rails, когда я делаю это с помощью ActiveRecord, я могу думать о

Deal.all.each { |deal| deal.update_attribute(:count => (deal.count + 1))}

и это занимает гораздо больше SQL-запросов вместо одного запроса. Есть ли лучший способ сделать это в Rails (не используя SQL-запрос непосредственно в приложении Rails).

Ответ 1

Использование ActiveRelation update_all Обновляет все записи с данными, если они соответствуют набору заданных условий, также могут быть указаны лимиты и порядок. Этот метод создает один оператор SQL UPDATE и отправляет его прямо в базу данных. Он не создает экземпляры задействованных моделей и не вызывает обратные вызовы Active Record.

http://apidock.com/rails/ActiveRecord/Base/update_all/class

Ответ 2

Deal.update_all("count = count + 1")

выходы

UPDATE "deals" SET count = count + 1

И с условным:

Deal.where(order_id: 2).update_all("count = count + 1")

выходы

UPDATE "deals" SET count = count + 1 WHERE "deals"."order_id" = 2