我找到了一种从 http 请求更新数据库模型的方法,如下所示;
case class DatabasePerson(
id: Int,
name: Option[String],
surname: String
)
case class PersonUpdateRequest(
name: Option[String],
surname: Option[String]
) {
def update(databasePerson: DatabasePerson) = databasePerson.copy(
name = name.orElse(databasePerson.name),
surname = surname.getOrElse(databasePerson.surname)
)
}
通过这种方式,我可以更新客户端发送的唯一字段。我认为仅将更新(或触摸)的字段发送到 api 等技术的首选方式。
如果有人需要从数据库中删除一个可选字段,我的问题就开始了。在示例中,它可以是 name
value
我想到的唯一方法是期待一个无效值,例如 ""
可能。因此,调整此类协议(protocol)的更新模型如下所示;
case class PersonUpdateRequest(
name: Option[String],
surname: Option[String]
) {
def update(databasePerson: DatabasePerson) = databasePerson.copy(
name = if (name.exists(_.isEmpty)) None else name.orElse(databasePerson.name),
surname = surname.getOrElse(databasePerson.surname)
)
}
这仅适用于字符串,但我也有日期、数字或复杂模型。如您所见,为所有字段编写代码有点乏味。
我正在使用 play framework 进行验证,所以有一个像这样的映射器用于更新请求;
object PersonUpdateRequest {
lazy val map = mapping(
"name" -> optional(text),
"surname" -> optional(text)
)(apply)(unapply)
}
在更新方法中删除可选字段的首选方法是什么。 谢谢。
最佳答案
一种适合您的数据模型的方法是在您的选项上添加另一个级别的 Option
:
case class PersonUpdateRequest(
name: Option[String],
surname: Option[Option[String]]
)
所以你可以有那些案例:
surname == Some(Some("foo")) // set surname to "foo"
surname == Some(None) // set surname to None == delete the value in the db
surname == None // do not update
这意味着使用自定义映射器。这可能适用于自定义 json 阅读器 Reads[Option[Option[T]]
。像这样的东西:
JsUndefined => None
JsNull => Some(None)
JsString(value) => Some(Some(value)
但我不确定如何将它与 Form
关于scala - 删除 DAO 模型中的可选字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48316447/