0

我正在使用 Play Framework 和 Squeryl 为数据库制作一个相当基本的前端,但我知道我正在重写太多代码。我有不同的模型来表示我的数据库中的数据,它们都执行相同的六个功能

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
}

因此,我为每个模型使用案例类,并为这些命令使用附带的对象。如何在 Scala 中使用泛型或特征来让我的生活更轻松,而不是每次都输入所有这些方法?

编辑:主要通过 gzm0 的答案解决,但现在的问题是我将如何在特征中实现 getAll ?我希望能够为类似于model.aDifferentFieldForEachModel上述的每个模型保存一些变量。

4

1 回答 1

2

您可以尝试以下方法:

trait ModelOps[T] {
  def table: AppDB.Table // not sure about type
  def order: AppDB.OrderByPredicate // not sure about type
  def toJson(model: T): JsValue

  def add(model: T): Option[T] = Option(AppDB.categories.insert(model))
  def remove(id: Long) = AppDB.categories.delete(id)
  def getAll(): List[T] = from(table)(model => select(model) orderBy(order)) toList
  def allToJson() = {
    val json:List[JsValue] = getAll.map{toJson(_)}
    Json.toJson(json.toSeq)
  }

}

然后你可以为每个模型类型:

object ModelType extends ModelOps[ModelType] {
  def table = AppDB.examples
  def order = yourPredicate
  def toJson(model:ModelType):JsValue = {
    Json.toJson(Map("field" -> Json.toJson(model.field)))
  }
  def validate(different values for each model) = // is fairly different for each one. Validates the submitted fields from a user
}

更新关于真实类型AppDB.OrderByPredicate

调用返回一个select. 在 this 上,您将调用which 接受一个(或同一参数列表中的多个)。因此,您应该定义:PrimitiveTypeModeSelectStateSelectStateorderByList[BaseQueryYield#O]

def order(model: T): List[BaseQueryYield#O]

def getAll() = from(table)(model => select(model) orderBy(order(model))) toList

顺便说一句,BaseQueryYield#O解决ExpressionNode.

于 2013-06-11T18:53:25.533 回答