ruby-on-rails - Rails - 具有多种值(value)类型的 EAV 模型?

标签 ruby-on-rails database ruby-on-rails-3 activerecord model

我目前有一个模型 Feature 被其他各种模型使用;在这个例子中,它将被客户使用。

为了保持灵 active ,Feature 用于存储名字、姓氏、姓名、出生日期、公司注册号等内容。

你会注意到一个问题 - 虽然其中大部分是字符串,但理想情况下,出生日期等特征将存储在日期类型的列中(并且将是日期选择器而不是 View 中的文本输入) .

如何最好地处理这个问题?目前我只有一个字符串列“值”;我考虑过使用多个值列(例如 string_value、date_value),但这似乎不是特别有效,因为每条记录中总会有一个空列。

非常感谢有关如何处理此问题的任何建议 - 谢谢!

最佳答案

根据您的需要,我认为您可以通过多种方式进行操作。我对其中任何一个都不完全满意,但也许它们可以为您指明正确的方向:

  1. 序列化一切

Rails 可以将任何对象存储为字节流,而在 Ruby 中,一切都是对象。因此理论上您可以在数据库列中存储任何对象的字符串表示形式,包括字符串、日期时间,甚至您自己的模型。 Marshal模块大部分时间都为您处理,如果您的对象有特殊需要,则允许您编写自己的序列化方法。

优点:真正将所有内容存储在单个数据库列中。

缺点:处理数据库中数据的能力很小——基本上不可能将此列用作存储以外的任何东西——你(可能)无法根据它对数据进行排序或过滤,因为格式不会是数据库可以识别的任何内容。

  1. 每种数据类型的列

这基本上是您在问题中建议的解决方案 - 准确找出您可能需要存储的数据类型 - 您提到了字符串和日期戳。如果这些列不多,则可以简单地为每种类型设置一个列,并且只将数据存储在其中一个列中。您可以重写属性访问器函数以使用适当的列,并且从外部看,Feature 就像 .value 是您需要的任何东西一样。

优点:只需要一张 table 。

缺点:每条记录中至少有一个空值。

  1. 多个模型/表格

您可以为您可能需要的每种功能制作模型 - TextFeature、DateFeature 等。This guide on Multiple Table Inheritance传达思想和方法。

优点:没有空值 - 每条记录只包含它需要的列。

缺点:复杂。除了需要多个模型之外,如果您需要直接处理数据库中不同类型的特征,您可能会发现自己在进行复杂的连接和联合。

关于ruby-on-rails - Rails - 具有多种值(value)类型的 EAV 模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12057104/

相关文章:

ruby-on-rails - 使用 Rack 中间件的参数调用 Controller 操作

mysql - 从 tbl1.x = tbl2.x = tbl3.x 的多个表中选择/加入

database - 内存中的 H2 数据库,插入脚本不持久

ruby-on-rails - 如何使用 ActiveRecord 映射多个属性?

ruby-on-rails - 功能定位

ruby-on-rails - 迁移时 "uninitialized constant ActiveRecord"

ruby-on-rails - Rails and Devise - 创建初始用户 - 缺少加密密码

t.date 属性小于当前年份的 SQL

ruby-on-rails - 如何更新rails中的 bool 值

mysql - 添加一列需要另一列的默认值?