Rails迁移列类型多态

时间:2015-12-04 14:44:31

标签: ruby-on-rails database database-design types migration

我有一点我想照顾的情况,但我甚至不知道它是否可能。

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

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

模型代表了一个属性。这些属性可以是:这个任务是否打开(类型"布尔"值"真"例如)?此任务是否具有百分比(类型"整数",值" 20")?请注意,该表还有一个列名。

2 个答案:

答案 0 :(得分:0)

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

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

我猜你可能正在寻找的东西就像一个enum来表示你的模型的状态。

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

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

如果您想存储其他信息,请谨慎使用其他数据库列。就像您要监视进度一样,您将创建一个名为tickets.progress的整数数据库列。

答案 1 :(得分:0)

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

  • “integer:100”,“integer:23”等
  • “boolean:true”,“boolean:false”等。

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


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

一般情况下,如果您遇到一个您认为可以包含多个数据类型的列的情况 - 数据库中存在错误,您应该对数据库进行“重新设计”。

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

  1. status_id - 将引用另一个表,其中包含所有可能的状态(如果有超过2个选项)。
  2. 进度/百分比 - 整数。

  3. 我的答案与关系数据库无关。