実行するCRUD操作がいくつかあり、それぞれがモデルのコレクション(ゲームのスケジュール、チーム名簿、ゲームの結果、ゲームの統計など)に基づいています。
Playエクスペリエンスのこの時点まで(わずか数か月、1つのプロジェクトがライブ)、モデルインスタンスへの1対1のフォームバインディングを使用してきました。
フォームのフィールド名に数値でインデックスを付けることができることは知っていますが、投稿されたフォームをList [Model]にバインドするにはどうすればよいですか?
これは私の1対1のバインディングがどのように見えるかです:
// 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)
するということは、フォームバインディングが、プロパティがすべてコレクションである単一のコンポジットインスタンスを返すことを意味します。おそらくそれは機能しますが、モデルインスタンスのコレクションを操作するほどクリーンで単純ではないようです。
アイデアを高く評価しました;-)