我有一个查询update deals set count = count + 1
。在Rails中,当我使用ActiveRecord执行此操作时,我可以想到
Deal.all.each { |deal| deal.update_attribute(:count => (deal.count + 1))}
这需要更多的SQL查询而不是一个查询。有没有更好的方法在Rails中执行此操作(不直接在Rails应用程序中使用SQL查询)。
答案 0 :(得分:18)
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
答案 1 :(得分:9)
使用ActiveRelation update_all
如果所有记录与提供的一组条件匹配,则更新所有记录,还可以提供限制和订单。此方法构造单个SQL UPDATE语句并将其直接发送到数据库。它不会实例化所涉及的模型,也不会触发Active Record回调。