scala - 删除 DAO 模型中的可选字段

标签 scala rest api playframework patch

我找到了一种从 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/

相关文章:

scala - take 函数在 Scala Map 上定义良好吗?

scala - Akka - 您应该创建多少个 Actor 实例?

java - 在 Tomcat 中托管服务时总是收到 404 Not found

php - codeigniter rest_controller 响应中的文本/html 格式

java - AWS ElasticSearchService - Java SDK 示例?

Scala 使用可变变量来实现其 api

javascript - 批量 REST API POST 处理

javascript - 解决类型错误 : event is undefined

php - 推特错误代码 215 : Bad Authentication Data

API 请求一次调用所有页面?