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))
})
我有以下型号:
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
:
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))
})