поле приращения массы на 1 - PullRequest
14 голосов
/ 11 февраля 2011

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

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

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

Ответы [ 2 ]

19 голосов
/ 14 августа 2014
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
9 голосов
/ 11 февраля 2011

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

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

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