Вычитание в рельсах - PullRequest
       0

Вычитание в рельсах

0 голосов
/ 13 сентября 2018

У меня есть объект с целочисленным типом атрибута.Я хочу вычесть 1 из атрибута после определенного действия.Я попытался в контроллере:

  def subtraction
    #find a item  and get the value, let's say value is 40
    item = Item.where(id: params[:id]).pluck(:value)

    # subtract 1 from the value and i thought it would be 40-1
    after_subtraction = item.to_i - 1

    #update the value
    final = item.update(value: after_subtraction)
  end

Я получаю:

NoMethodError (undefined method `to_i' for [40]:Array

Когда я удаляю to_i, он говорит, что - не метод.Есть ли способ обновить сохраненное значение?

Ответы [ 4 ]

0 голосов
/ 13 сентября 2018

На основании того, как вы построили запрос, он получает значение для всех записей, соответствующих условию where, поэтому метод .pluck возвращает массив, для которого нельзя вызвать метод .to_i.

Полагаю, вам нужно выбрать нужное значение из первой записи, соответствующей вашему запросу, поэтому вы можете выполнить рефакторинг, как показано ниже

def subtraction
  #find the first item with id supplied
  item = Item.where(id: params[:id]).first

  #after subtraction value
  val = item.value - 1

  #update the value
  final = item.update(value: val)
end
0 голосов
/ 13 сентября 2018

Лучший способ обработки -

item = Item.find_by(id: params[:id]).value

pluck вернет вам массив, который здесь не нужен в вашем случае.

0 голосов
/ 13 сентября 2018

Поскольку pluck возвращает массив, который вы не можете использовать to_i для преобразования здесь.

Увидев свой код, вы можете выполнить его рефакторинг следующим образом:

  def subtraction
    # Find the item first
    item = Item.find(params[:id])

    # Subtract 1 from the value column of the item
    item.value -= 1

    # Save the modification of the item
    item.save!
  end
0 голосов
/ 13 сентября 2018

Вы не можете напрямую конвертировать массив в to_i.Пожалуйста, используйте метод ниже

after_subtraction = item.join.to_i - 1

Да, ответ Нитина более действителен.Вы можете пойти с ответом Нитина.вам не нужно использовать pluck , пока вы не захотите массив из нескольких значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...