Rails 3 update_all使用表中已包含的数据,基于每个记录

Joh*_*urr 5 sql ruby-on-rails-3 update-all

这与以下内容有些模糊: 如何更新表格中的所有日期 但是只有当你眯着眼睛才真的很难.

第1部分 - 我知道SQL可以根据涉及同一个表上其他列的公式更新表上的一列.它可以通过一个简单的SQL行完成,如下所示:

UPDATE thieving_prices SET current_price = (1 + usury_rate) * current_price;
Run Code Online (Sandbox Code Playgroud)

现在所有的价格都被各种相关的恶劣价格所提高.

第2部分 - 我也知道Rails 3提供了一个名为update_all的神奇魔法,它使用单行SQL创建UPDATE查询:

ThievingPrice.update_all(:current_price = 35000.00)
Run Code Online (Sandbox Code Playgroud)

产生:

UPDATE thieving_prices SET current_price = 35000.00;
Run Code Online (Sandbox Code Playgroud)

现在所有产品的价格都相同.在这个偷偷摸摸的商店里非常无用.

第3部分 - 所有这些价格都有自己稳定的增长率,并且需要在Rails 3中编写优雅的代码行来实现它.

和行:

ThievingPrice.update_all(:current_price => (1 + :usury_rate) * :current_price)
Run Code Online (Sandbox Code Playgroud)

不起作用.关于括号,括号或括号的任何句法变异也没有 - 就我的实验所表明的那样.当然,其他人也需要这样的建筑.我不想回到每个块的极其缓慢和资源浪费:

ThievingPrice.each do |tp|
  new_price = tp.current_price * (1 + tp.usury_rate)
  tp.update_attribute(:current_price => new_price)
end
Run Code Online (Sandbox Code Playgroud)

当完成我的受害者顾客离开商店.我有什么选择?

Sco*_*hea 8

试试ThievingPrice.update_all("current_price = (1 + ?) * current_price" , :usury_rate).它应该取参数,并根据当前正在更新的对象将当前价格乘以该数量.