在Rails中构建具有多个功能和属性的数据库对象的最佳方法

时间:2013-12-10 00:58:11

标签: ruby-on-rails ruby database attributes

我有一个产品型号。每个产品都有不同的功能集,并具有许多功能。

而不是创建列出其所有功能的产品模型(因为这将包括我不需要的许多功能,当我需要添加新功能时,这将是困难的)我的想法是创建一个列存储“特征数组”。所以,不管这个产品是笔记本电脑,我想知道屏幕尺寸,我可以打电话:

@laptop.features[:screen]
=> "15.6 inch"

这个问题我不确定是否有一种简单实用的方法来构建一个可以接受各种功能的表单,然后将它们映射到数组。

我发现了一个railscast(#196),它解释了在rails中内置了accepts_nested_attributes_for,它基本上既使用了产品模型又使用了Feature模型,只关联了两个记录。

哪种方式会更好?这种问题有一个共同的方法吗?是否有办法在视图中使用可接受功能的表单? (即使它们不直接与产品模型的数据库结构分开)

2 个答案:

答案 0 :(得分:1)

我肯定会采用一种更灵活的解决方案,即与功能建立良好的关系。然后,您可以轻松调用@product.features来获取产品功能,并且当您想要执行诸如为屏幕分配多个属性之类的操作时,灵活性会非常闪耀。如果要将哈希值投入数据库,则无法向屏幕添加两个属性(无论如何都很容易)。

假设您希望@ product.features [:screen]在未来显示TFT的IPS以及尺寸,那么您必须拥有嵌套的哈希或其他非常难以处理的东西。

答案 1 :(得分:0)

也许是一个功能表,其中包含您要为产品提及的功能,可能带有type属性。可能"类型:显示,键:大小,值:1920x1080"或"类型:HDD,键:容量,值:2GB"。您可以使用该类型来创建家庭'钥匙您可以将按键设为想要跟踪的任何内容,而值只是一个字符串。

通过构建功能列表,您可以创建一个连接表/模型(分配?),用于跟踪哪个产品具有哪些功能。

Product (id, non-feature attributes)
    has_many assignments
    has_many features, through assignments 

Feature (id, type, key, value)
    has_many assignments
    has_many products, through assignments

Assignments (id, product_id, feature_id, timestamps?)
    belongs_to product
    belongs_to feature

鉴于您已将产品ID与功能ID相关联,您可以在不破坏任何内容的情况下调整功能值文本。决定" 1920x1080"应该是" 1920px x 1080px" - 只需更改功能记录。