如何在Rails中存储许多可选字段?

时间:2012-11-12 14:23:14

标签: ruby-on-rails database-design activerecord

我正在开发一个显示产品的应用。每个产品都是一个型号(产品),有一些常见的信息,如名称,品牌等。要分开我们正在查看的产品类型,我们有 product_type (如:电话,电视,沙发)等)这基本上是一个tinyint字段(例如1 =电话,2 =电视)。

现在,取决于product_type每个产品可以有不同的选项:如果是手机产品应该有额外的信息关联(如重量,它有LTE,是否有前置摄像头等),电视应该有显示尺寸等信息。

我的问题是:根据产品类型,将此额外数据添加到产品的最佳/或/最简单的方式是什么?

我正在考虑使用额外的模型 ProductOptions ,其中包含可存储额外字段的字段product_id,option_type,option_value(VARCHAR),但我不确定这是否是性能和放大器的可选项;搜索。在这种情况下,搜索意味着找到符合给定条件的所有ProductOptions(例如po = ProductOption.where(:option_type => "LTE", :option_value => "yes")),然后执行Product.findAllIn(po)来查找实际产品。

或者我应该使用Postgres并使用HStore? HStore在搜索时是否有效?

有什么想法吗?

Rails新手,所有代码都是伪代码

1 个答案:

答案 0 :(得分:2)

如果您已经在查看ProductType,可以将其设为Single-Table Inheritance并实际定义不同的产品类型。无论如何,这将更容易编码。在这种情况下:

class Product < ActiveRecord::Base
  # common functionality goes here
end

class Sofa < Product
  # sofa specific functionality goes here
end

然后,您可以将所有选项放在产品表中,但对不同的产品类型使用不同的attr_accessible,验证和视图。

关于此设置的最佳部分是它在rails中“正常工作”,您只需在products表上放置一个type列。此外,它可以让你找到所有沙发:

Sofa.all

以及所有类似的事情

Product.all

就数据库性能而言,您最终会得到相当数量的空字段,但您的所有属性都是可搜索的(与序列化不同),您只需要在一个表上查询。所以,我希望这比我所知道的任何其他选项都要好。

另外,它很好,面向对象。 :)

祝你好运,欢迎来到Rails!