我有几个 CRUD 操作要执行,每个操作都在一组模型上(例如比赛时间表、球队名单、比赛结果、比赛统计等)。
到目前为止,在我的 Play 体验中(仅几个月,1 个项目上线),我一直在使用一对一的表单绑定到模型实例。
我知道我可以对表单字段名称进行数字索引,但是如何将发布的表单绑定到 List[Model]?
这是我的一对一绑定的样子:
// abstract away bindFromRequest to make binding more concise in controllers
def bindForm[T](f: play.api.data.Form[T])(implicit r: play.api.mvc.Request[_]) =
f.bindFromRequest fold(e=> Left(e.errorsAsJson), Right(_))
然后在控制器中:
val result = for {
model <- bindForm(form).right
id <- dao.create(model) as json
} yield id
我想做的是相同的,但不是模型绑定在成功时返回单个模型,而是让它返回一个 List[Model],并传递给重载的 DAO 创建/编辑/删除操作。
我看到有一种list
方法可以用作表单映射的一部分,但我感觉这会对我的 JDBC 查询包装器 (ScalaQuery/Slick) 造成严重破坏,其案例类/伴随对象映射可能不会发挥作用很好的集合属性。
例如,游戏时间表的现有映射如下所示:
object CompositeForm {
import play.api.data.{Form, Forms}, Forms._
import utils.Validator.Bindings.jodaLocalTimeFormat
val mapper = mapping(
'id -> ignored(0),
'gameDate -> jodaDate,
'gameType -> optional(text),
'location -> optional(text),
'team1 -> number,
'team2 -> number
)(Composite.apply)(Composite.unapply)
val form = Form( mapper )
}
使用list(gameDate), list(gameType)
instead 意味着表单绑定将返回一个 Composite 实例,其属性都是集合 - 也许它会工作,但看起来不像使用模型实例集合那样干净/直接。
想法赞赏;-)