有效地存储“答案”

时间:2009-10-28 17:57:04

标签: ruby-on-rails ruby activerecord

我正在构建一个可以有不同类型答案的Answer ActiveRecord类。也就是说,答案可以是整数,浮点数,日期,字符串......等等......

我看待它的方式有两种方法来存储答案

1)

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

这很好,因为您始终可以从同一个地方访问答案。搜索答案可能很糟糕,因为必须对数据进行反序列化才能使用(这是一个正确的假设吗?)

2)

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

这是最容易搜索的(如果你知道你正在搜索什么类型(你可能会这样做))

这很糟糕,因为价值不在同一个地方,需要一些好的方法,如:

def value
  stringValue||floatValue||integerValue
end

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

你会做什么?

2 个答案:

答案 0 :(得分:2)

我会做两件事之一:

  1. 使用单表继承。你的表确实包含那些integerValue,floatValue等字段;但它也包含一个“类型”字段,你将子类化答案模型以生成IntegerAnswer,FloatAnswer,StringAnswer等。然后你可以简单地将访问者映射到 one < / em>每个子类中的那些字段。有关如何实现这一点的更多信息,请参阅敏捷本书或Google中关于Rails中单表继承的内容。
  2. 使用非关系数据库。像MongoDBCouchDB之类的东西会让这个问题变得毫无疑问;您可以将设置为您想要的任何内容,或者每个答案都有多个值,或者完全跳过它。我个人喜欢带有MongoMapper宝石的Mongo,如果我必须解决你的用例,那就是我要去的方向。虽然它远离ActiveRecord和“主流”Rails,所以你必须在生活中至少生活得舒服。

答案 1 :(得分:1)

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

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

然后对于浮动,你有以下内容:

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

执行Answer.find(:all)时,如果元素的值为FloatAnswer,则会有一个FloatAnswer对象。不是答案之一。

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