优惠券系统订单价格更新

问题描述 投票:0回答:1

您好,我正在编码优惠券系统导轨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
ruby-on-rails ruby-on-rails-5
1个回答
0
投票

[基于我们在评论中的讨论,我假设order_items的字段为coupon_id为空(如果未应用优惠券代码),或者包含应用于order_items的代码的ID。

现在,可以使用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

注意:长期而言,从一个模型的回调中调用另一个模型的方法可能有点困难。在这种情况下,您可以使用事件驱动机制,以防该应用程序变得很大

© www.soinside.com 2019 - 2024. All rights reserved.