【问题标题】:How to store many optional fields in Rails?如何在 Rails 中存储许多可选字段?
【发布时间】:2012-11-12 23:40:22
【问题描述】:

我正在开发一个显示产品的应用。每个产品都是一个型号(产品),包含一些常见信息,如名称、品牌等。为了区分我们正在查看的产品类型,我们有一个 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 新手,所有代码都是伪代码

【问题讨论】:

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


    【解决方案1】:

    如果您已经在查看 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!

    【讨论】:

      猜你喜欢
      • 2014-09-09
      • 1970-01-01
      • 2011-02-01
      • 2018-12-22
      • 1970-01-01
      • 2020-02-03
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多