Купонная система Обновление цены заказа - PullRequest
0 голосов
/ 13 октября 2019

Привет! Я кодирую купонную систему рельсов. 5.2.3. Но у меня есть проблема. Если код купона введен до оплаты, применяется скидка. Но я не могу обновить итоговую цену, если товар удален из корзины.

Модель заказа: Каждое обновление рассчитывает цену

   def subtotal
    price = order_items.includes(:product).collect { |oi| oi.valid? ? (oi.quantity * oi.unit_price) : 0 }.sum
  end

Контроллер купонов

def check_coupon_code
    if @coupon = Coupon.find_by(code: params[:code])
      coupın = Coupon.find_by(code: params[:code])
      @order = current_order
      if @coupon[:redemption_limit] > 0 and @coupon[:active] === true
        @order.total_amount = current_order.subtotal - coupın.amount
        @order.update(order_param)
        Coupon.transaction do
          Coupon.where(code: params[:code]).each do |coupon|
            coupon.redemption_limit = coupon.redemption_limit - 1
            coupon.save
          end
        end
        @order.update(code_apply)
        redirect_to "/cart"
        flash[:notice] = 'Coupon Code Applied!'
      else
        redirect_to "/cart"
        flash[:danger] = 'Coupon Code Invalid!'
      end
    else
      redirect_to "/cart"
      flash[:danger] = 'Coupon Code Invalid!'
    end
  end

Контроллер позиции заказа

def update
    @order = current_order
    @order_item = @order.order_items.find(params[:id])
    @order_item.update_attributes(order_item_params)
    @order_items = @order.order_items
  end

  def destroy
    @order = current_order
    @order_item = @order.order_items.find(params[:id])
    @order_item.destroy
    @order_items = @order.order_items
  end

1 Ответ

0 голосов
/ 14 октября 2019

Исходя из нашего обсуждения в комментариях, я предполагаю, что order_items имеет coupon_id в качестве поля, которое либо пустое (если код купона не применяется), либо содержит идентификатор кода, примененного к order_items.

Теперь обновление цены заказа в соответствии с удалением можно выполнить с помощью обратного вызова before_destroy в модели order_item. Вы можете сделать что-то следующим образом:

# order_item.rb

before_destroy :update_order_price

private

def update_order_price
  # Your logic to recalculate the order price
end

ПРИМЕЧАНИЕ. Вызов методов другой модели из обратного вызова одной модели может быть немного сложным в долгосрочной перспективе. В этом случае вы можете использовать механизм, управляемый событиями, если это приложение станет действительно большим

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