我有以下型号:
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获得错误。
答案 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))
})