我正在使用Play Framework和Squeryl为数据库创建一个相当基本的前端,但我知道我重写了太多的代码。我有不同的模型来表示我的DB中的数据,它们都执行相同的六个功能
object ModelType{
def add(model:ModelType):Option[ModelType] = Option(AppDB.tablename.insert(model))
def remove(id: Long) = AppDB.tablename.delete(id)
def getAll():List[ModelType] = from(AppDB.tablename)(model => select(model) orderBy(model.aDifferentFieldForEachModel)) toList
def toJson(model:ModelType):JsValue ={
Json.toJson(
Map("field" -> Json.toJson(model.field))
)
}
def allToJson() = {
val json:List[JsValue] = getAll.map{toJson(_)}
Json.toJson(json.toSeq)
}
def validate(different values for each model) = // is fairly different for each one. Validates the submitted fields from a user
}
所以我为每个模型使用case类,并为这些命令使用一个附带的对象。我怎样才能在scala中使用泛型或traits来使我的生活更简单,而不是每次都把这些方法都打出来?
EDIT:大部分用gzm0的答案解决了,但现在的问题是我如何在trait中实现getAll?我希望能够为每个模型保存一些变量,这些模型与上述model.aDifferentFieldForEachModel
相似。
1条答案
按热度按时间hi3rlvi21#
您可以尝试以下操作:
然后,您可以针对每个模型类型:
UPDATE关于
AppDB.OrderByPredicate
的真实类型:在
PrimitiveTypeMode
上调用select
将返回SelectState
。在这个SelectState
上,您将调用orderBy
,它接受一个List[BaseQueryYield#O]
(或同一参数列表中的多个)。因此,您应该定义:和
顺便说一下,
BaseQueryYield#O
解析为ExpressionNode
。