理解ruby中的方法调用

时间:2015-07-17 06:33:19

标签: ruby oop ruby-on-rails-4

我有两个班级

class Cart
  belongs_to :coupon
end

class Coupon
  has_many :carts

  def discount
  end
end

我执行

cart = Cart.last.coupon.discount

如果不将购物车作为参数传递,我如何知道折扣方法中哪个购物车?

4 个答案:

答案 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