Rails 迁移列类型多态

Rails Migration Column Type Polymorphic

我有点情况想处理,但我什至不知道是否可行。

在我的应用程序中,我有一个模型可以采用参数值,该参数可以是字符串或整数或布尔值。

而不是做两个字符串列(在我的迁移中),一个标记为 "type"(类型 - 真的!),另一个标记为 "value"(对于...值!是的!)我想知道是否有可能只剩下列值,其中有多态类型。

模特代表 属性 任务。这些属性可以是:此任务是否已打开(例如输入 "boolean" 和值 "true")?此任务是否有百分比(类型 "integer",值“20”)?请注意,table 也有一个列名。

Polymorphism in Rails 更多的是关于相关项的 class 未知的关联 - 而不是具有动态类型的数据库列。

虽然可以使用两个字符串列 valuevalue_type 在关系数据库中实现动态列并使用自定义 getter 对值进行类型转换,但它会变得非常混乱.另一种可能性是使用类似 HSTORE 或 JSON 列类型的东西,但你真的需要它吗?有没有比尝试将所有内容都塞到一个列中更好的方式来构建您的业务逻辑?

我猜您可能正在寻找类似于 enum 的东西来表示模型的状态。

class Ticket < ActiveRecord::Base
  enum status: [ :open, :closed, :pending, :active ]
end

这将使用名为 status 的整数列。

如果您想存储额外的信息,使用额外的数据库列是明智的。就像如果你想监控你会创建一个名为 tickets.progress.

的整数数据库列的进度

对于您的回答,是的,这是可能的,但不要那样做。
可以在所有不同情况下使用字符串:

  • "integer:100"、"integer:23"、等等
  • "boolean:true"、"boolean:false"等

您需要识别每种数据类型(使用 concat)并转换为正确的类型,然后您才能使用该值。


但这是完全错误的,它的实现会非常复杂
我强烈建议不要使用这个例子或类似的东西。
我认为这是一个错误的数据库结构。

一般来说,如果您有一个列,您认为它可以包含不止一种数据类型——您的数据库有问题,您应该对数据库创建一个 'redesign'。

通常最好的做法是分开到不同的列。
在你的情况下,你的列可以得到不同的类型,每种类型代表不同的信息。我认为您的 table 应该有这些列:

  1. status_id - 将引用另一个 table,状态将包含所有可能的状态(如果有超过 2 个选项)。
  2. progress/percentage - 整数。


我的回答与关系数据库无关。