我有两个班级
class Cart
belongs_to :coupon
end
class Coupon
has_many :carts
def discount
end
end
我执行
cart = Cart.last.coupon.discount
如果不将购物车作为参数传递,我如何知道折扣方法中哪个购物车?
答案 0 :(得分:2)
那就是我的方法:
class Cart
belongs_to :coupon
def discount
coupon.discount(self) unless coupon.nil?
end
end
class Coupon
has_many :carts
def discount(cart)
# use the coupon discount logic to apply discount on particular cart
end
end
答案 1 :(得分:1)
您无法使用优惠券。我建议您在购物车内委托折扣。
class Cart
belongs_to :coupon
delegate :discount, to: coupon
end
class Coupon
has_many :carts
def discount
end
end
然后你可以
discount = cart.discount
但请注意,委托是一种rails方法。我假设,当你使用belongs_to和标记ruby-on-rails时,你就在rails中。但是,如果没有,这也可行:
class Cart
belongs_to :coupon
def discount
coupon.discount if coupon
end
end
答案 2 :(得分:1)
它无法完成,AFAIK,即使你可以,它也将是一个可怕而脆弱的黑客。当您使用折扣方法时,您无法再访问特定购物车,只能访问与优惠券相关的所有购物车。如果那只是一辆车,那你很幸运。
我建议,为了减少耦合并更好地遵守德米特定律,将在购物车上创建折扣方法
FNCMode
另一种选择可能是另一个ActiveRecord类,让我们称之为CouponActivation,坐在中间,将推车和优惠券联系起来,并计算折扣本身。
购物车属于CouponActivation,CouponActivation有一个购物车,属于优惠券,优惠券有许多优惠券活动和许多购物车通过CouponActivations。您将折扣方法放在CouponActivation中,并可以访问您想要的信息。
仍然建议只传递值。更容易,更清晰,更容易测试。
答案 3 :(得分:0)
我认为你采取的方法并不好。 如果优惠券是对象,可以给你一个购物车总价格的折扣,那么我会用这个:
class Cart
has_and_belongs_to_many :coupons
def calculate_discount
#this is place where you can get rid of double coupons or coupons that are not allowed together
for coupon in coupons
coupon.apply_discount_to(self)
end
end
end
class Coupon
has_and_belongs_to_many :carts
end