在使用Play和Anorm创建基本应用程序的过程中,我在处理尚未保存到数据库的实体时遇到了问题。表单显然没有ID字段,因此我无法使用案例类apply
方法创建映射。我最终创建了两个类 - 一个用于持久化实体,一个用于尚未持久化,代码看起来像这样
case class EphemeralUser(email: String)
case class PersistentUser(id: Long, email: String)
val userForm = Form(mapping("email" -> text))(EphemeralUser.apply)(EphemeralUser.unapply)
def create(user: EphemeralUser): PersistentUser = { /* Save with Anorm */ }
使用单个case class User(id: Option[Long], email: String)
是否有更优雅的方式来处理它?或者甚至更好,删除代码重复的一些方法导致我有点像持久和短暂用户是不同类型的事实。
答案 0 :(得分:1)
我认为不需要两种类型。制作id
Option[Long]
就足够了。要测试模型是否已保留,只需要检查user.id.isDefined
。
您的Form
可以使用ignored
仍然可以利用apply
和unapply
:
case class User(id: Option[Long], email: String)
val userForm = Form {
mapping(
"id" -> ignored[Option[Long]](None),
"email" -> email
)(User.apply)(User.unapply)
}