Поле прироста массы на 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