【问题标题】:Can i do simple maths in Active Record Ruby on Rails我可以在 Active Record Ruby on Rails 中做简单的数学运算吗
【发布时间】:2020-04-22 23:08:32
【问题描述】:
我想在用户保存发票时更改商品的数量
我使用类似 Item.find_by(itemName: 'kimas').update(:quantity => +7) 的东西,由于某种原因它替换了旧值,例如如果值为 10 并运行此 Item.find_by(itemName: 'kimas').update(:quantity => +7) 值更改为 7
class Invoice < ApplicationRecord
before_save :check_me
before_update :check_me
def check_me
items = itemname.length
i = 0
while i < items
item_new = Item.find_by(itemName: itemname[i])
sumup = ( quantity[i] * price[i] + (quantity[i] * price[i] * tax[i]/100) )
Item.find_by(itemName: 'kimas').update(:quantity => +=7)
i += 1
end
end
end
【问题讨论】:
标签:
ruby-on-rails
ruby
ruby-on-rails-6
【解决方案1】:
很遗憾,您只能使用 Active Record 的 update 设置 新 值。
在您的情况下,update(:quantity => +=7) 实际上会引发 syntax error, unexpected operator-assignment)。
您在本题中使用的另一种形式update(:quantity => +7) 实际上等同于update(:quantity => 7),与update(quantity: 7) 相同。 +7 只是 7 的另一种说法。正如您所注意到的,此操作确实只将新值设置为 7。
要解决您的问题,您可以将 1-liner 拆分为 2 行:
- 将您找到的项目存储在变量中
- 使用变量的先前值进行计算
例如将Item.find_by(itemName: 'kimas').update(:quantity => +=7) 替换为:
item = Item.find_by(itemName: 'kimas')
item.update(quantity: item.quantity + 7)
另一种选择是创建原始 SQL 代码,但对于您的情况可能会有点过头了。
【解决方案2】:
像这样调用 update 会将该值设置为您传递的任何值,并尝试匹配在数量列上找到的数据类型(我假设它是整数),这就是您得到 7 而不是 17 的原因。
你可以试试这样的:
found_item = Item.find_by(itemName: 'kimas')
found_item.update(quantity: found_item.quantity + 7)