ScalaQuery和Play框架:处理未分配(AutoInc)主键的最佳实践

时间:2012-07-29 15:58:46

标签: scala playframework playframework-2.0 scalaquery

我正在使用Play 2.0.2和ScalaQuery 0.9.5。

我有以下简单的型号代码:

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” - >会更好吗?忽略(-1L)到Form映射并使用Task的提取函数?

3)是否应该在没有id字段的情况下定义case类?

1 个答案:

答案 0 :(得分:3)

如果Task有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())
      }
    )
  }
}
相关问题