如何存储和列出具有不同属性的活动记录对象?



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

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

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

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

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

我对此的想法是,要有一个单一的产品模型,其中抽象出最一般的属性,这个模型将belong_to一个类别模型,这将决定下一个关联,可能是belongs_to category_attributes。然后,这将要求我为每个类别提供一个属性表,根据为产品选择的类别,我将获得如下所示的内容:

类别为"车辆"的商品has_one vehicles_attributes。

我想知道处理这种情况的"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" })

一个明显的缺点是需要更多的努力来验证属性的存在、类型和值(必须以编程方式执行此操作),注意spec_attrs长度,如果你有更多的描述性属性,等等。

相关内容

  • 没有找到相关文章

最新更新