【问题标题】: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 =&gt; +=7) 实际上会引发 syntax error, unexpected operator-assignment)

    您在本题中使用的另一种形式update(:quantity =&gt; +7) 实际上等同于update(:quantity =&gt; 7),与update(quantity: 7) 相同。 +7 只是 7 的另一种说法。正如您所注意到的,此操作确实只将新值设置为 7。

    要解决您的问题,您可以将 1-liner 拆分为 2 行:

    1. 将您找到的项目存储在变量中
    2. 使用变量的先前值进行计算

    例如将Item.find_by(itemName: 'kimas').update(:quantity =&gt; +=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)
      

      【讨论】:

        猜你喜欢
        • 2011-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多