Scala数据建模和泛型

w41d8nur  于 2023-04-30  发布在  Scala
关注(0)|答案(1)|浏览(115)

我正在使用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相似。

hi3rlvi2

hi3rlvi21#

您可以尝试以下操作:

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
}

UPDATE关于AppDB.OrderByPredicate的真实类型:

PrimitiveTypeMode上调用select将返回SelectState。在这个SelectState上,您将调用orderBy,它接受一个List[BaseQueryYield#O](或同一参数列表中的多个)。因此,您应该定义:

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

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

顺便说一下,BaseQueryYield#O解析为ExpressionNode

相关问题