2009-10-28 83 views
1

我正在构建一个可以有不同类型的答案的答案ActiveRecord类。也就是说,答案可能是一个整数,浮点数,日期,串...什么...高效地存储“答案”

的方式我看它有存储答案

1)

有两种方法一个名为“value”的属性被序列化。

这很好,因为你总是可以从同一个地方访问答案。它可能很烂搜索答案,因为数据必须被反序列化,以使用(这是一个正确的假设?)

2)

有几个属性integerValue,的floatValue等..

这是最简单的搜索(如果你知道你在寻找什么类型的(这你可能这样做))

太差劲了,因为值不在同一个地方,需要像有些做作的方法:

def value 
    stringValue||floatValue||integerValue 
end 

和一些验证,以确保只有正确的设置

你会做什么?

回答

2

我会做两件事情之一:

  1. 使用单表继承。你的表包含了那些integerValue,floatValue等字段;但它还包含一个“类型”字段,并且您将对Answer模型进行子类化以生成IntegerAnswer,FloatAnswer,StringAnswer等。然后,您可以简单地将访问器映射到一个的每个子类中的这些字段。在Rails的单表继承中查看敏捷书籍或Google,了解如何实现这一点。
  2. 使用非关系数据库。像MongoDBCouchDB会导致这个问题没有实际意义;你可以使的值为任何你想要的,或者每个答案有多个值,或者完全跳过它。我个人喜欢蒙戈与MongoMapper宝石,如果我必须解决你的用例,那就是我要去的方向。它虽然远离ActiveRecord和“主流”Rails,所以你必须适应至少一点生活在边缘。
+0

是的,STI就是这样。 – jsharpe

1

什么将值转换为数据库中的字符串。 并使用单表继承来定义类型并检索适当的值。

你会有一个模型回答两个字段:一个“值”,这是一个字符串。
和一个“类型”,它也是一个字符串,并获取值的类型。

然后浮子,你有以下:

class FloatAnswer < Answer 
    def value 
     attributes['value'].to_f 
    end 
end 

当你做一个Answer.find(:all),如果元素具有FloatAnswer的价值,你将有一个FloatAnswer对象。不是答案之一。

因此,您只保留一个数据库字段,并始终以适当的格式存储数据。

+0

这与使用'serialize:value'基本相同,并创建一个搜索噩梦,因为所有不同的数据类型都存储为字符串...也就是说,如何有效地搜索给定日期(在DB,而不是AR),如果它存储为s字符串? 如果我要去STI,我可能会为每个数据类型都有一个不同的列,并执行类似的操作,如类FloatAnswer jsharpe