我正在设计一个管理许多不同设备租赁的应用程序。我想知道什么是为应用程序设计模型的最佳方法。我的软件必须管理许多不同类型的设备(包括数据类型),例如:
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
我考虑过设计的方式:
但是铁路处理这些不同类型产品的最佳方式是什么?
答案 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"
)。最后,在实例化模型时执行服务器端验证,以确保它是有效类型。您还可以执行一些操作,以便确保Microphone
和Speaker
是您的代码实际使用的唯一两种“用途”。
完全不同但更干净的方法是执行我在第一段中提到的所有内容,但继续继承到较低级别。具体来说,Microphone
延长BaseItem
,Microphone
Make
和Model
参数,然后设置模型InstrumentalMicrophone
,VocalMicrophone, and
VersatileMicrophone extend the
麦克风`类。这将是最干净的,并将允许完整的功能。