Ruby on rails 如何存储和列出具有不同属性的ActiveRecord对象?

Ruby on rails 如何存储和列出具有不同属性的ActiveRecord对象?,ruby-on-rails,activerecord,database-design,Ruby On Rails,Activerecord,Database Design,我目前正在开发一个小项目,它是一个分类广告应用程序 对于此应用程序,我有以下要求:我们将有一组类别,每个类别将存储不同的信息,例如:车辆的分类广告将需要有与发动机、制造年份、里程、,描述和真实状态相关的广告显然不会有这些信息,而是需要存储其他类别的房产类型、价格、年份、房间数量等 因此,问题是:解决这一问题的最佳方法是什么,以便我能够: 1) 搜索时从所有类别中提取广告,并将其显示在单个结果页面中 2) 保存每个类别对应的数据,但避免在我的数据库模型中有太多的空列 我所想的是,有一个单一的产品模

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

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

因此,问题是:解决这一问题的最佳方法是什么,以便我能够:

1) 搜索时从所有类别中提取广告,并将其显示在单个结果页面中

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

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

类别为“vehicles”的产品具有“one vehicles”属性

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


谢谢。

如果类别集是静态的,您的方法就可以了。无论何时添加新类别和/或属性,都需要进行更改

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

# 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" })
一个明显的缺点是,is需要更多的努力来验证属性的存在性、类型和值(必须以编程的方式进行验证),如果您有更多的描述性属性,请注意spec_attrs的长度,等等。思考您将来需要什么,然后做出决定