多种产品类型购物车的Rails方式

时间:2012-06-16 17:38:06

标签: ruby-on-rails activerecord ruby-on-rails-3.2

我正在设计一个管理许多不同设备租赁的应用程序。我想知道什么是为应用程序设计模型的最佳方法。我的软件必须管理许多不同类型的设备(包括数据类型),例如:

Speaker
  Make - String
  Model - String      
  Wattage - Integer
  Price - Decimal

Light
  Make - String
  Model - String      
  Wattage - Integer
  Price - Decimal

Microphone
  Make - String
  Model - String
  Use - Choice of: Instrumental, Vocal, Versatile
  Price - Decimal

Cable
  Length - Decimal
  Connector 1 - String
  Connector 2 - String
  Price - Decimal

Stand
  Type - Choice of: Microphone, Speaker
  Height - Decimal
  Boom - Boolean
  Price - Decimal

我考虑过设计的方式:

  • 每种产品的单独型号,然后购物车中的多态关联,以便它可以处理所有类型的设备。
  • 单个产品型号,其中包含所有类型设备的字段,其类型字段可在使用产品时进行检查。
  • 具有price属性的产品型号,然后每种类型的产品都扩展该模型。

但是铁路处理这些不同类型产品的最佳方式是什么?

5 个答案:

答案 0 :(得分:4)

动态属性gem应该允许您自动执行此操作:

https://github.com/moiristo/dynamic_attributes

可能有更好的宝石可以满足您的需求,但这是我发现的第一个宝石。

如果您使用Postgres作为数据库,则可以使用hstore。有一些宝石可以与hstore一起使用。如果您负担得起,请订阅railscast并观看有关实施hstore的screencast

Activerecord-postgres-hstore似乎是为此而去的宝石。

答案 1 :(得分:2)

我个人会选择单一型号产品和另一款名为ProductAttribute的型号。

在此表格中,您有name列和value列。

这样,您不受架构的限制。产品有n product_attributes,动态命名。您可以在管理部分中开发快捷方式,这样如果您创建麦克风产品,它将自动在链接表中创建特定的属性名称。你只需要输入值。

这样,您的应用程序就可以完全销售任何具有任何属性的产品。在3个月内管理员想要添加其他类型的产品时,无需再次编码:)

编辑:当然,您可以使用ProductType模型来管理您可以销售的所有不同产品类型。

答案 2 :(得分:1)

另一种选择是制作产品属性表,并通过管理界面而不是低级代码构建每种产品类型。这样你就不需要改变应用来销售新产品了。

答案 3 :(得分:1)

这个问题以前引起了许多ERP解决方案供应商的头痛。 根据我在一家这样的供应商看到的内容,我建议你提出的最优雅的解决方案就是这个。

您定义了4个模型: 设备,设备类型,特点,选择。

设备和特性之间存在多对多关系,通过EquipmentType。 特征模型具有名为“value_type”的属性,并且还具有您拥有的每个值类型的一个属性(String,Integer,Decimal,Boolean)。 最后,在特征和选择之间会有一对多的关系。

这实际上是该供应商实施的一个淡化版本,适合您的特定要求。 该供应商的实际实现实际上是在一个或两个抽象层次上构建的,超出了我向您展示的内容,以使解决方案更具通用性。但是那些人因过度工程而闻名。

HTH。

答案 4 :(得分:0)

第三种方法非常接近正确的方法。您肯定希望将项目的所有通用参数(例如商店ID,以及,如您所述,价格)抽象到基本模型中,其他项目将扩展。然后,正如您在第一个提议的解决方案中提到的那样,您将在必要时使用:引用在其余项目类之间引用。

对于“类型”和“使用”,您可能最好使用与父模型的一对一关系。然后,为每个模型存储可能的字段类型列表(例如,Stand,类似possible_uses = "Microphone, Speaker")。最后,在实例化模型时执行服务器端验证,以确保它是有效类型。您还可以执行一些操作,以便确保MicrophoneSpeaker是您的代码实际使用的唯一两种“用途”。

完全不同但更干净的方法是执行我在第一段中提到的所有内容,但继续继承到较低级别。具体来说,Microphone延长BaseItemMicrophone MakeModel参数,然后设置模型InstrumentalMicrophoneVocalMicrophone, and VersatileMicrophone extend the麦克风`类。这将是最干净的,并将允许完整的功能。