【问题标题】:How to store and list ActiveRecord objects with different attributes?如何存储和列出具有不同属性的 ActiveRecord 对象?
【发布时间】:2017-08-18 20:18:06
【问题描述】:

我目前正在开发一个小项目,它是一个分类应用程序。

对于这个应用程序,我有以下要求:我们将有一组类别,每个类别将存储不同的信息,例如:车辆的分类需要具有与发动机、制造年份、里程、描述相关的信息与真实状态相关的广告显然不会包含此信息,而是需要为每个其他类别存储房产类型、价格、年份、房间数量等。

所以问题是:解决这个问题的最佳方法是什么,以便我可以:

1) 在进行搜索时从所有类别中获取广告并将它们显示在单个结果页面中。

2) 保存每个类别对应的数据,但避免我的数据库模型中有太多空列

我的想法是,有一个单一的产品模型,其中抽象了最通用的属性,这个模型将属于一个类别模型,它将决定下一个关联,可能是一个属于类别的属性。然后,这将要求我为每个类别都有一个属性表,并且根据为产品选择的类别,我将拥有如下内容:

类别为“车辆”的产品具有_一个车辆_属性。

我想知道处理这种情况的“Rails 方式”是什么

谢谢。

【问题讨论】:

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


    【解决方案1】:

    如果类别集非常静态,您的方法还可以,并且可以正常工作。每当您添加新类别和/或属性时,都需要进行更改。

    当我需要更大的灵活性时,曾经对我有用的一个想法是:

    # Migration
    create_table :products do |t|
      t.integer :category_id
      t.string :name
      t.string :description
      t.[...] # maybe other common fields here
      t.string :spec_attrs, limit: 1000
      t.timestamps
    end
    
    # Model
    class Product
      belongs_to :category
      serialize :spec_attrs, Hash
    end
    

    此设置允许您创建不同的产品,例如:

    Product.create(category: Category.find_by(:name, "Vehicles"),
                   name: "M1 Abrams",
                   description: "..."
                   spec_attrs: { year: 1975,
                                 transmission: "manual"
                                 max_speed: 72 })
    Product.create(category: Category.find_by(:name, "Estates"),
                   name: "Taj Mahal",
                   description: "..."
                   spec_attrs: { year: 1653,
                                 rooms: 268,
                                 country: "India",
                                 city: "Agra" })
    

    一个明显的缺点是需要更多的努力来验证属性的存在、类型和值(必须以编程方式进行),如果你有更多描述性的属性,请注意 spec_attrs 的长度等。想想你将来需要什么并做出决定。

    【讨论】:

      猜你喜欢
      • 2017-02-20
      • 1970-01-01
      • 2018-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 2017-09-07
      相关资源
      最近更新 更多