Play Framework 2.4のJava版を、Scala版(Play 2.5.x)+Slick3へ置き換えを始めようと考えております。
Scalaの知識は、コップ本を読んで少しサンプルを書いた程度なので、これを気にしっかりと覚えていきたいと思っております。
Java版とScala版での違いでわからないことがあり、質問させて頂きます。
FormのValidateの使い方でvalidate内でDBへアクセスする方法を教えてほしいのですが、Javaでは、Form用のオブジェクトを用意してその中で、DBへアクセスし存在チェックなどを行っておりました。
Java
1 public List<ValidationError> validate() { 2 3 List<ValidationError> errors = new ArrayList(); 4 5 //ここで存在チェック 6 7 return 0 < errors.size() ? errors : null; 8 } 9
Scalaの場合、コントローラーに、validateを記述し、そこで、DBへアクセスを行って存在チェックをしようとしております。
Scala
1class BookController @Inject()(book: bookDao)(implicit context: ExecutionContext) extends Controller { 2 3 def validate(name: String, category: String) = { 4 5 logger.debug(bookDataId) 6 7 val f = book.isPrice(name, category) 8 f.isCompleted match { 9 case true => 10 Some(BookData(name, category)) 11 case _ => 12 Some(null) 13 } 14 } 15 16 val userForm = Form( 17 mapping( 18 "name" -> text, 19 "category" -> text 20 )(BookData.apply)(BookData.unapply) verifying("エラー", fields => fields match { 21 case bookData => validate(bookData.name, bookData.category).isDefined 22 }) 23 ) 24} 25
Scala
1class BookDao @Inject()(protected val dbConfigProvider: DatabaseConfigProvider) 2 extends HasDatabaseConfigProvider[JdbcProfile] { 3 4 import driver.api._ 5 6 val booktable = TableQuery[BookTable] 7 8 def all(): Future[Seq[Book]] = db.run(booktable.result) 9 10 def isPrice(name: String, category: String): Future[Option[BookTable]] = 11 db.run( 12 booktable.filter( 13 n => 14 (n.name === name) && (n.category === category) 15 ).result.headOption) 16}
DBへの問合せが行われていることは、ログを出力して確認しております。
Slick3が、非同期でのDBへの問合せとなっており、validate内で実行した際に、
validateの後に、SQLが実行されてしまっております。
そもそも、こういった使い方でよいのか?
検討もつかず、わからなくなり質問させていただきました。
上記のソースを踏まえ、一般的な、Play Scala のvalidateの使い方について、ご教授いただけないでしょうか?
よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。