如何编写具有动态绑定的Rails ActiveRecord更新查询?

时间:2018-11-12 15:18:02

标签: ruby-on-rails

使用where,我们可以Item.where('stock_amount > ?', 0)

问题:是否有一种方法可以在ActiveRecord中编写并生成以下SQL?

UPDATE items SET stock_amount = stock_amount - 10 where id = 1;

我尝试过

Item.update(1, {stock_amount: ['stock_amount - ?', 10]}

它可以运行,但不会生成我想要的SQL。

我知道我可以用更多的行来达到相同的结果

item = Item.find(1)
item.stock_amount = item.stock_amount - 10
item.save

并使用exec_update

ActiveRecord::Base.connection.exec_update('UPDATE items SET stock_amount = stock_amount - $1 WHERE id = $2', 'sql', [[nil, 10],[nil, 1]])

This post是我得到的最接近的东西。

1 个答案:

答案 0 :(得分:3)

Item.where(id: 1).update_all(["stock_amount = stock_amount - ?", 10])

应产生:

UPDATE "items" SET stock_amount = stock_amount - 10 WHERE "items"."id" = $1  [["id", 1]]