scala验证模型额外参数,不应保存在数据库中

时间:2017-06-19 12:28:17

标签: scala playframework slick playframework-2.5

我有以下型号:

case class ProcessStepTemplatesModel(
                                      id: Option[Int],
                                      title: String,
                                      createdat: String,
                                      updatedat: String,
                                      deadline: Option[Date],
                                      comment: Option[String],
                                      stepType: Int,
                                      deleted: Boolean,
                                      processtemplate: Option[Int])

object ProcessStepTemplatesModel {
  implicit val processStepFormat = Json.format[ProcessStepTemplatesModel]
}

我有一个额外的值derived。所有数据都通过POST作为JSON发送到我的控制器。当我使用上面的模型验证请求时,此值将丢失。

我需要这个值才能使用该模型,但它不应该被保留。

但是如果我将值添加到模型中,我会从Scala slick获得错误。

更新: enter image description here

1 个答案:

答案 0 :(得分:1)

从我的头脑中,有两种选择:

<强> 1。将您的前端表示与实际模型分离

您可以拥有ProcessStepTemplatesClientModel,其中包含额外字段derived,仅用于验证控制器中的JSON输入。完成涉及derived字段的业务逻辑后,将对象转换为ProcessStepTemplatesModel并将其保留在数据库中。

<强> 2。处理光滑表格*投影中的字段

ProcessStepTemplatesModel类中包含派生字段(假设它是布尔值,适用于任何其他原语):

case class ProcessStepTemplatesModel(
                                      id: Option[Int],
                                      title: String,
                                      createdat: String,
                                      updatedat: String,
                                      deadline: Option[Date],
                                      comment: Option[String],
                                      stepType: Int,
                                      deleted: Boolean,
                                      processtemplate: Option[Int],
                                      derived: Boolean)

由于你使用Slick作为数据库映射器,你可能有ProcessStepTemplatesModel的表格表示:

class ProcessStepTemplatesModelTable(tag: Tag) extends Table[ProcessTableTemplatesModel](tag, "PROCESS_TABLE_TEMPLATES_MODEL") {
    def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
    ...
    def processtemplate = column[Option[Int]]("PROCESSTEMPLATE")

    def * = (id, ..., processtemplate) <> ( {
        tuple: (Int, ..., Option[Int]) => ProcessStepTemplatesModel(tuple._1, ..., tuple._9, derived = false)
      }, {
        ps: ProcessStepTemplatesModel => Some((ps.id, ..., ps.processtemplate))
      })
}

不要在表定义中包含派生字段,并在* -projection中处理该情况,方法是将静态值传递给case类构造函数,以便从元组创建对象,并在创建时保留它。来自对象的元组。

修改

作为对您的评论的回复,基于ProcessStepTemplatesModel derived的{​​{1}}更具体地实施*投影:

def * : ProvenShape[ProcessStepTemplatesModel] = (id.?, title, createdat, updatedat, deadline, comment, stepType, deleted, processtemplate) <> ( {
        tuple: (Option[Int], String, String, String, Option[Data], Option[String], Int, Boolean, Option[Int]) => ProcessStepTemplatesModel(tuple._1, tuple._2, tuple._3, tuple._4, tuple._5, tuple._6, tuple._7, tuple._8, tuple._9, derived = false)
      }, {
        ps: ProcessStepTemplatesModel => Some((ps.id, ps.title, ps.createdat, ps.updatedat, ps.deadline, ps.comment, ps.stepType, ps.deleted, ps.processtemplate))
      })