2015-07-17 3 views
1

У меня есть два классаПонимание метод вызывают рубин

class Cart 
    belongs_to :coupon 
end 

class Coupon 
    has_many :carts 

    def discount 
    end 
end 

исполняют

cart = Cart.last.coupon.discount 

Как я могу знать, какая телегу это в методе дисконтирования без прохождения телеги в качестве параметра?

+1

Что вы имеете в виду «который телега это без прохождения телеги в качестве параметра»? – Pavan

+0

по описанию проблемы, что бы вы ни пытались достичь - скорее всего, вы ошибетесь –

+0

@ AndreyDeineko, что я чувствую, что это не должно быть Cart.last.coupon.discount (cart.last) – chirag7jain

ответ

1

Вы не можете получить купон. Я предлагаю вам делегировать скидку в корзине.

class Cart 
    belongs_to :coupon 
    delegate :discount, to: coupon 
end 

class Coupon 
    has_many :carts 

    def discount 
    end 
end 

Тогда вы можете

discount = cart.discount 

Однако, обратите внимание, что делегат представляет собой метод рельсы. Я предполагаю, что, поскольку вы используете belongs_to и помечены ruby-on-rails, вы находитесь в пределах rails. Однако, если нет, то это также будет работать:

class Cart 
    belongs_to :coupon 

    def discount 
    coupon.discount if coupon 
    end 
end 
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

Это не может быть сделано, AFAIK, и даже если вы могли бы, это было бы ужасно и хрупкий взломать. Когда вы используете метод скидок, у вас больше нет доступа к конкретной корзине, только все тележки, связанные с купоном. Если это всего лишь одна тележка, вам повезло.

То, что я хотел бы предложить, а также для того, чтобы уменьшить сцепление и лучше соответствовать закону Деметры, было бы создать метод скидок на корзину

def discount 
    coupon.discount(self) 
end 

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

В корзину есть CouponActivation, CouponActivation имеет одну корзину и принадлежит к Coupon, Coupon имеет много CouponActivations и многих Carts через CouponActivations. Вы устанавливаете метод скидок в CouponActivation и получаете доступ к необходимой вам информации.

По-прежнему желательно просто передавать значения. Легче, яснее, легче тестировать.

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 
Смежные вопросы