Удалить количество в следующем объекте, если количество первого объекта == 0 - PullRequest
1 голос
/ 12 марта 2019

Моя Фондовая модель имеет атрибуты quantity и variant_id.

Я добавляю новую акцию один раз в неделю для такого варианта:

stock_1 = id: 1, variant_id: 1, quantity: 1, created_at:  Tue, 19 Feb 2019 15:19:00 UTC +00:00

stock_2 = id: 2, variant_id: 1, quantity: 3, created_at:  Tue, 26 Feb 2019 15:19:20 UTC +00:00

stock_3 = id: 3, variant_id: 1, quantity: 10, created_at:  Tue, 05 Mar 2019 15:19:39 UTC +00:00

Когда я продаю товар, я хочу удалить его из первого запаса, где количество превышает 0.

Я попробовал этот метод, который почти выполняет эту работу.

Проблема в том, что если я закажу 3 товара в одном и том же варианте: из запаса будет удалено 3 количества, поэтому запас будет отрицательным ...

Что бы вы предложили мне удалить остальныесо склада_2 ...

Есть ли способ улучшить идею?

@stock_1st = Stock.where(variant_id:1).where('quantity > 0').first

if @stock_1st.quantity == 0
  @stock_2nd = Stock.where(variant_id: item.variant_id).where('quantity > 0').first
  @stock_2nd.quantity -= item.quantity.to_i
  @stock_2nd.save
else
  @stock_1st.quantity -= item.quantity.to_i
  @stock_1st.save
end

РЕДАКТИРОВАТЬ

спасибо Алексею Матюшкину за вашу драгоценную помощь, но у меня все еще есть проблемы

здесь метод:

 def remove_from_stock
  self.items.each do |item|
    Stock.where(variant_id: item.variant_id).where('quantity > 0').order(:created_at).reduce(item.quantity.to_i) do |quantity, stock|
      if leftover = item.quantity.to_i - stock.quantity <= 0
        stock.update_attributes! quantity: stock.quantity - item.quantity.to_i 
        break
      else
        stock.update_attributes! quantity: 0
        leftover
       end
      end
    end
   end

Сделал еще несколько тестов, и у меня действительно есть проблема: согласно моему примеру (который тоже выше).

Мой начальный запас на variant_id: 1

stock_1 = id: 1, variant_id: 1, quantity: 1, created_at:  Tue, 19 Feb 2019 15:19:00 UTC +00:00

stock_2 = id: 2, variant_id: 1, quantity: 3, created_at:  Tue, 26 Feb 2019 15:19:20 UTC +00:00

stock_3 = id: 3, variant_id: 1, quantity: 10, created_at:  Tue, 05 Mar 2019 15:19:39 UTC +00:00

Если я закажу 5 статей в этом variant_id: 1

, мой оставшийся запас будет 0 везде ...

stock_1 = 0   #1/1 article is removed from this stock
stock_2 = 0   #3/3 articles are removed from this stock 
stock_3 = 0   #Only 1/10 should be removed, but stock.update_attributes!  set to quantity: 0 

Как я могу это исправить, пожалуйста?

1 Ответ

3 голосов
/ 12 марта 2019

Вы должны получить весь запас и Enumerable#reduce, если только не распределено все количество:

Stock.
    where(variant_id: item.variant_id).
    where('quantity > 0').
    order(:created_at).
    reduce(item.quantity.to_i) do |quantity, stock|

  if (leftover = quantity - stock.quantity) <= 0
    stock.update_attributes! quantity: stock.quantity - quantity
    break
  else
    stock.update_attributes! quantity: 0
    leftover
  end

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