Scala的一个很好的优点是可以保证类型安全,因此应用程序中不会出现任何未定义的值。然而,Mongo根本不是类型安全的。因此,我认为,对Mongo的一种转换是好的,以确保只保存正确的值(作为字符串)。我的Scala中有这种类型:
sealed trait Tribe
object Tribe {
def fromString(s:String) = s match {
case "Earth Pony" => EarthPony
case "Pegasus" => Pegasus
case "Unicorn" => Unicorn
case "Alicorn" => Alicorn
case _ => throw new NoSuchElementException
}
}
case object EarthPony extends Tribe {
override def toString = "Earth Pony"
}
case object Pegasus extends Tribe {
override def toString = "Pegasus"
}
case object Unicorn extends Tribe {
override def toString = "Unicorn"
}
case object Alicorn extends Tribe {
override def toString = "Alicorn"
}
现在我想创建一个TribeField
字段,我可以在MongoRecord
类中使用它来确保在我读取记录时完成此转换,或保存它。
不幸的是,关于Lift记录的文档似乎很少,到目前为止我还没有找到有关如何执行此操作的任何有用信息。也许有人可以给我一些提示?
答案 0 :(得分:2)
我很确定lift-record-mongodb使用提升记录Field实例的功能,通过Field.asJValue和Field.setFromJValue对JSON进行序列化/反序列化。要创建一个完全类型安全的Tribe Field,您需要创建自己的TypedField [Tribe]并实现这些方法以及设置和访问您的字段的其他抽象方法。我建议看看StringField或其他一个具体的Field类型,以获取有关如何做到这一点的指示。
更简单的替代方法是扩展StringField本身并添加setTribe / asTribe方法。
如果您需要更多信息,特别是关于Lift的Mongodb集成,我建议您尝试使用Lift Google Group。保持代码的蒂姆·尼尔森通常很快回答问题。