1

ScalaQuery 0.9.5 で Play 2.0.2 を使用しています。

次の単純なモデル コードがあります。

case class Task(id: Long, name: String)

object Task extends Table[(Long, String)]("task") {

lazy val database = Database.forDataSource(DB.getDataSource())

def id = column[Long]("id", O PrimaryKey, O AutoInc)
def name = column[String]("name", O NotNull)

def create(task: Task) = database.withSession {
  implicit db: Session => {
    Task.name insert(task.name)
  }
}

そして、フォーム送信を処理するための次のコード:

val taskForm: Form[Task] = Form(
  mapping(
    "name" -> nonEmptyText
  ) {
    (name) => Task(-1L, name)
  } {
    task => Some(task.name)
  }
)

def newTask = Action {
  implicit request =>
    taskForm.bindFromRequest.fold(
      errors => BadRequest(views.html.index(Task.all, errors)),
      task => {
        Task.create(task)
        Redirect(routes.Application.tasks())
      }
    )
}

いくつかの質問:

1)定数を渡すよりも一時的な主キー値を処理するためのより良い方法はありますか? Anorm の NotAssigned に似たものはありますか?

2) フォーム マッピングに "id" -> ignore(-1L) を追加し、タスクのエクストラクタ関数を使用する方がよいでしょうか?

3) id フィールドなしでケース クラスを定義する必要がありますか?

4

1 に答える 1

3

aTaskに ID がある場合、(まだ) ID を持たない値を表すためにこのクラスを使用しないでください。とにかく、作成されたオブジェクトには、フォームに入力されたものとは異なるデータ (作成日など) が含まれているのが普通なので、オブジェクトの作成に必要な値と作成されたオブジェクトを表すために同じクラスを使用することは通常意味がありません。自体。

したがって、別のケース クラスを定義することもできますTaskForm(最終的には の共通ベースから継承される可能性がありTaskます)。または、String値を生成するフォームを使用するだけです。

// Task
case class Task(id: Long, name: String)

object Task extends Table[(Long, String)]("task") {
  lazy val database = Database.forDataSource(DB.getDataSource())

  def id = column[Long]("id", O PrimaryKey, O AutoInc)
  def name = column[String]("name", O NotNull)

  def create(name: String) = database.withSession { implicit db: Session =>
    Task.name insert(name)
  }
}


// Application
object Application extends Controller {
  val taskForm = Form("name" -> nonEmptyText)
  def newTask = Action { implicit request =>
    taskForm.bindFromRequest.fold(
      errors => BadRequest(views.html.index(Task.all, errors)),
      name => {
        Task.create(name)
        Redirect(routes.Application.tasks())
      }
    )
  }
}
于 2012-07-29T21:17:33.153 に答える