9

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

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

我对设计的看法:

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

但是,在轨道中处理这些不同类型产品的最佳方式是什么?

4

5 回答 5

4

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

https://github.com/moiristo/dynamic_attributes

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

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

Activerecord-postgres-hstore似乎是这方面的首选。

于 2012-07-28T16:36:18.573 回答
2

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

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

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

这样,您的应用程序就完全能够销售具有任意数量属性的任何类型的产品。当经理在 3 个月内想要添加另一种类型的产品时,无需再次编码 :)

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

于 2012-07-28T12:23:53.693 回答
1

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

于 2012-06-16T18:41:38.933 回答
1

这是之前让很多ERP解决方案厂商头疼的问题。根据我在此类供应商处看到的情况,我向您建议的最优雅的解决方案就是这个。

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

Equipment 和 Characteristic 之间会有多对多的关系,通过 EquipmentType。Characteristic 模型有一个名为“value_type”的属性,以及您拥有的每种值类型(String、Integer、Decimal、Boolean)的一个属性。最后,特性和选择之间会有一对多的关系。

这实际上是该供应商实施的简化版本,适合您的特定要求。该供应商的实际实现实际上是在我向您展示的之上一两个抽象级别构建的,以使解决方案更通用。但这些人以过度设计事物而闻名。

HTH。

于 2012-08-03T09:59:31.203 回答
0

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

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

一种完全不同但更简洁的方法是执行我在第一段中提到的所有操作,但将继承继续到较低级别。具体来说,有Microphoneextend BaseItem,给出and参数Microphone,然后有 models ,VersatileMicrophone Microphone` 类。这将是最干净的,并将允许完整的功能。MakeModelInstrumentalMicrophoneVocalMicrophone, andextend the

于 2012-07-27T22:02:12.503 回答