根据您的需要,我可以通过多种方式看到您这样做。我对其中任何一个都不完全满意,但也许它们可以为您指明正确的方向:
- 序列化一切
Rails 可以将任何对象存储为字节流,而在 Ruby 中一切都是对象。因此,理论上您可以将任何对象的字符串表示形式存储在数据库列中,包括字符串、日期时间,甚至您自己的模型。Marshal模块大部分时间都会为您处理这个问题,如果您的对象有特殊需要,您可以编写自己的序列化方法。
优点:真正将任何内容存储在单个数据库列中。
缺点:处理数据库中数据的能力很小 - 基本上不可能将此列用作存储以外的任何内容 - 您(可能)无法根据它对数据进行排序或过滤,因为格式不会t 是数据库可以识别的任何东西。
- 每种数据类型的列
这基本上是您在问题中建议的解决方案 - 准确找出您可能需要存储的数据类型 - 您提到了字符串和日期戳。如果其中没有太多,则可以简单地为每种类型设置一个列,并且只在其中一个中存储数据。您可以覆盖属性访问器函数以使用正确的列,并且从外部,Feature 将表现得好像.value
是您需要的任何东西。
优点:只需要一张桌子。
缺点:每条记录中至少有一个空值。
- 多个模型/表格
您可以为您可能需要的每种功能创建一个模型 - TextFeature、DateFeature 等。本关于多表继承的指南传达了这个想法和方法。
优点:没有空值 - 每条记录只包含它需要的列。
缺点:复杂性。除了需要多个模型之外,如果您需要直接使用数据库中不同类型的功能,您可能会发现自己在执行复杂的连接和联合。