您好,我正在编码优惠券系统导轨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
[基于我们在评论中的讨论,我假设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
注意:长期而言,从一个模型的回调中调用另一个模型的方法可能有点困难。在这种情况下,您可以使用事件驱动机制,以防该应用程序变得很大