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

scala validate on model extra parameter which should not be saved in database

我有以下型号:

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 中收到错误。

更新:

在我的脑海中,有两个选项供您选择:

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

你可以有一个 ProcessStepTemplatesClientModel,它有额外的字段 derived 并且只用于验证控制器中的 JSON 输入。完成涉及 derived 字段的业务逻辑后,将对象转换为 ProcessStepTemplatesModel 并将其保存在数据库中。

2。处理 Slick 的 *-projection 中的字段 table

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

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 作为数据库映射器,您可能有一个 table 代表 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))
      })
}

不要在 table 定义中包含派生字段,并通过将静态值传递给案例 class 构造函数来从元组创建对象,从而在 *-projection 中处理该案例并在从对象创建元组时将其省略。

编辑

作为对您评论的回应,基于 ProcessStepTemplatesModel 包括 derived

的更具体的 *-projection 实现
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))
      })