Могу ли я сделать простую математику в Active Record Ruby на Rails - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу изменить количество товара, когда пользователь сохраняет счет-фактуру. Я использую что-то подобное 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

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

К сожалению, вы можете установить новое значение только с помощью update.

Active Record. В вашем случае update(:quantity => +=7) фактически повысит syntax error, unexpected operator-assignment).

Другая форма, которую вы использовали в этом вопросе update(:quantity => +7), фактически эквивалентна update(:quantity => 7), и такая же, как update(quantity: 7). +7 это просто еще один способ сказать 7. Как вы заметили, эта операция на самом деле только устанавливает новое значение равным 7.

Чтобы решить вашу проблему, вы можете разбить свой 1-слойный текст на 2 строки:

  1. сохранить элемент, который вы Вы нашли в переменной
  2. используйте предыдущее значение переменной для вычисления

Например, замените Item.find_by(itemName: 'kimas').update(:quantity => +=7) на:

item = Item.find_by(itemName: 'kimas')
item.update(quantity: item.quantity + 7)

Будет создана другая опция необработанный SQL код, но, вероятно, будет излишним для вашей ситуации.

1 голос
/ 23 апреля 2020

При вызове update подобное значение будет установлено равным тому, что вы передадите, и попытается соответствовать типу данных, найденному в столбце количества (я предполагаю, что это целое число), поэтому вы получаете 7, а не 17.

Вместо этого вы можете попробовать что-то вроде этого:

found_item = Item.find_by(itemName: 'kimas')
found_item.update(quantity: found_item.quantity + 7)
...