在表单中将Pk [Long]转换为Option [Long]

时间:2014-12-18 02:00:04

标签: scala playframework playframework-2.3 anorm

自从Scala Anorm Pk被弃用以来,我一直无法理解这里的问题。

我将模型切换为以下内容:

case class Item(id: Option[Long] = NotAssigned,
            title: String,
            descr: String,
            created: Option[Date],
            private val imgs: List[Img],
            private val tags: List[Tag]) 

来自id: Pk[Long]

我将表单更改为:

val itemForm = Form(
    mapping(
      "id" -> ignored(23L),
      "title" -> nonEmptyText,
      "descr" -> nonEmptyText,
      "created" -> optional(ignored(new Date)),
      "imgs" -> Forms.list(itemImgs),
      "tags" -> Forms.list(itemTags)
    )(Item.apply)(Item.unapply)
)

来自"id" -> ignored(NotAssigned:Pk[Long])

但是,我得到了这个错误。

type mismatch; found : (Option[Long], String, String, scala.math.BigDecimal, Option[java.util.Date], List[models.Img], List[models.Tag]) => models.Item required: (Long, String, String, Option[java.util.Date], List[models.Img], List[models.Tag]) => ? )(Item.apply)(Item.unapply)

为什么Item模型不需要Option[Long]

我不知道23L是什么,但这就是Play文档中的内容。数据库中id的值来自序列。

如果我将其更改为:

"id" -> ignored(NotAssigned:Option[Long]),

这对我来说最有意义......我收到了这个错误:

type mismatch; found : anorm.NotAssigned.type required: Option[Long] "id" -> ignored(NotAssigned:Option[Long]),

这比以前更没意义。

1 个答案:

答案 0 :(得分:2)

只是为了澄清,不是Anorm被弃用了,而是Anorm中的Pk类型。

您的问题是,您尝试将NotAssigned分配给Option[Long],这是不兼容的。您应该将所有NotAssigned更改为None

所以你的课程看起来像这样:

case class Item(
    id: Option[Long] = None,
    title: String,
    descr: String,
    price: BigDecimal,
    created: Option[Date],
    private val imgs: List[Img],
    private val tags: List[Tag]
) 

Form映射:

"id" -> ignored[Option[Long]](None)