2012-07-29 5 views
1

ScalaQuery 0.9.5에서 Play 2.0.2를 사용하고 있습니다.ScalaQuery and Play 프레임 워크 : 할당되지 않은 (AutoInc) 기본 키 처리를위한 우수 사례

나는 다음과 같은 간단한 모델 코드가 있습니다

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"-> ignored (-1L)를 양식 매핑에 추가하고 작업의 추출기 기능을 사용하는 것이 더 좋습니까?

3) 사례 클래스를 id 필드없이 정의해야합니까?

답변

3

Task에 ID가있는 경우이 클래스를 사용하여 ID가없는 값 (아직)을 나타내지 않아야합니다. 어쨌든, 생성 된 객체에는 양식 (예 : 생성 날짜 등)에 채워진 데이터와 다른 데이터가 포함되어있는 것이 일반적이므로 은 객체를 생성하는 데 필요한 값을 나타 내기 위해 일반적으로 동일한 클래스을 사용하는 것이 바람직하지 않습니다. 생성 된 객체 자체.

그래서 다른 케이스 클래스를 정의 할 수 있습니다.

// 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()) 
     } 
    ) 
    } 
} 
: 귀하의 경우, (결국 Task의 공통 기본에서 상속 할 수있다), 또는 TaskForm, 그냥 String 값을 산출 양식을 사용