Ruby on rails 使用多态继承定义对象的行为

Ruby on rails 使用多态继承定义对象的行为,ruby-on-rails,inheritance,polymorphic-associations,Ruby On Rails,Inheritance,Polymorphic Associations,今天我面临一个挑战,为我的购物车模型创建不同的行为。这是因为网购的店主想要创建一些促销活动,比如买1、买5或买25%的折扣+一些额外的东西,等等 我想用多态继承来实现它,我的购物车模型将只保存购买的产品和配件,并将有许多行为模型,在这些模型中,它将获得数据,如购买总额,可以获得25%的折扣,并调用类似于完成交易的方法,我可以添加新的,为促销活动指定的产品,您可以获得5件免费的东西 在一开始,我觉得创建这种关系是对的,因为它不需要在模型接口上做太多工作,因为它将继续与其他对象正常通信,只是内部将被

今天我面临一个挑战,为我的购物车模型创建不同的行为。这是因为网购的店主想要创建一些促销活动,比如买1、买5或买25%的折扣+一些额外的东西,等等

我想用多态继承来实现它,我的购物车模型将只保存购买的产品和配件,并将有许多行为模型,在这些模型中,它将获得数据,如购买总额,可以获得25%的折扣,并调用类似于完成交易的方法,我可以添加新的,为促销活动指定的产品,您可以获得5件免费的东西

在一开始,我觉得创建这种关系是对的,因为它不需要在模型接口上做太多工作,因为它将继续与其他对象正常通信,只是内部将被更改。现在我看到自己在行为模型上创建了很多垃圾、重复的代码,并开始思考是否还有其他更优雅的方法来实现这一点


你知道更好的方法吗?

我已经用一些元编程解决了这个问题!现在,我的购物车模型的工作原理如下:

  def after_initialize

    extend BoxStandardMethods

    if self.box_behavior_type?
      extend Object.const_get(box_behavior_type)
    end
  end
其中,BoxStandardMethods是一个模块,它拥有标准购物车拥有的所有方法:添加商品、删除商品、获取商品总数等。如果我想覆盖其中任何一种方法,我只需使用一个具有我想覆盖的功能的模块设置购物车的box商品行为类型属性。 为了避免与接口不兼容,我正在使用向后兼容的自定义字段构建可扩展模块,即标准方法add_productproduct,amount实现为add_productproduct,amount,*custom_data,如果custom_data为nil,则调用super方法,有效调用在BoxStandardMethods上实现的方法

Ruby非常适合这种方法!该系统已经投入生产大约一周了,我一点问题都没有