我有一点我想照顾的情况,但我甚至不知道它是否可能。
在我的应用程序中,我有一个可以获取参数值的模型,此参数可以是字符串,也可以是整数或布尔值。
而不是做两个字符串列(在我的迁移中),其中一个标记为"键入" (类型 - 真的!)和另一个标记为"值" (对于......值!是的!)我想知道是否有可能只剩下列值,其中有多态类型。
模型代表了一个属性。这些属性可以是:这个任务是否打开(类型"布尔"值"真"例如)?此任务是否具有百分比(类型"整数",值" 20")?请注意,该表还有一个列名。
答案 0 :(得分:0)
Polymorphism in Rails更多关于相关项的类未知的关联 - 而不是具有动态类型的数据库列。
虽然可以使用两个字符串列value
和value_type
在关系数据库中实现动态列,并使用自定义getter来进行类型转换,但它会变得非常混乱。另一种可能性是使用类似HSTORE或JSON列的类型,但你真的需要它吗?是否有更好的方法来构建业务逻辑,而不是试图将所有内容都插入到一个列中?
我猜你可能正在寻找的东西就像一个enum来表示你的模型的状态。
class Ticket < ActiveRecord::Base
enum status: [ :open, :closed, :pending, :active ]
end
这将使用名为status
的整数列。
如果您想存储其他信息,请谨慎使用其他数据库列。就像您要监视进度一样,您将创建一个名为tickets.progress
的整数数据库列。
答案 1 :(得分:0)
对于你的答案,是的,这是可能的,但不要这样做。
可以在所有不同情况下使用字符串:
您将需要识别每种数据类型(使用concat)并转换为正确的类型,然后才能使用该值。
但这是完全错误的,其实现将非常复杂。
我强烈建议不要使用此示例或类似的东西。
我认为这是一个错误的数据库结构。
一般情况下,如果您遇到一个您认为可以包含多个数据类型的列的情况 - 数据库中存在错误,您应该对数据库进行“重新设计”。
通常最佳做法是分隔到不同的列。
在您的情况下,您的列可以获得不同的类型,每种类型代表不同的信息。我认为你的表应该有这些列:
我的答案与关系数据库无关。