2013-07-24 32 views
9

我正在與Slick的提升嵌入和映射表掙扎。 API對我來說感覺很陌生,也許只是因爲它的結構是我不熟悉的。如何將Slick的映射表與外鍵一起使用?

我想構建一個任務/待辦事項列表。有兩個實體:

  • 任務:每個任務都有一個對下一個任務的可選引用。這樣就構建了一個鏈表。目的是用戶可以按他的優先順序排列任務。該順序由任務對任務的引用表示。
  • TaskList:表示帶有標籤和對列表的第一個任務的引用的TaskList。

    case class Task(id: Option[Long], title: String, nextTask: Option[Task])
    case class TaskList(label: String, firstTask: Option[Task])


現在我試着寫一個數據訪問對象(DAO),這兩個實體。

import scala.slick.driver.H2Driver.simple._ 
import slick.lifted.MappedTypeMapper 

implicit val session: Session = Database.threadLocalSession 
val queryById = Tasks.createFinderBy(t => t.id) 

def task(id: Long): Option[Task] = queryById(id).firstOption 

    private object Tasks extends Table[Task]("TASKS") { 
    def id = column[Long]("ID", O.PrimaryKey, O.AutoInc) 
    def title = column[String]("TITLE") 
    def nextTaskId = column[Option[Long]]("NEXT_TASK_ID") 
    def nextTask = foreignKey("NEXT_TASK_FK", nextTaskId, Tasks)(_.id) 
    def * = id ~ title ~ nextTask <> (Task, Task.unapply _) 
    } 

    private object TaskLists extends Table[TaskList]("TASKLISTS") { 
    def label = column[String]("LABEL", O.PrimaryKey) 
    def firstTaskId = column[Option[Long]]("FIRST_TASK_ID") 
    def firstTask = foreignKey("FIRST_TASK_FK", firstTaskId, Tasks)(_.id) 
    def * = label ~ firstTask <> (Task, Task.unapply _) 
    } 

不幸的是,它不能編譯。這兩個表的*投影分別在nextTask各自的firstTask

  • could not find implicit value for evidence parameter of type scala.slick.lifted.TypeMapper[scala.slick.lifted.ForeignKeyQuery[SlickTaskRepository.this.Tasks.type,justf0rfun.bookmark.model.Task]]
  • could not find implicit value for evidence parameter of type scala.slick.lifted.TypeMapper[scala.slick.lifted.ForeignKeyQuery[SlickTaskRepository.this.Tasks.type,justf0rfun.bookmark.model.Task]]

我試圖解決與以下TypeMapper但是,這並不編譯,太。

implicit val taskMapper = MappedTypeMapper.base[Option[Long], Option[Task]](
    option => option match { 
     case Some(id) => task(id) 
     case _ => None 
    }, 
    option => option match { 
     case Some(task) => task.id 
     case _ => None 
    }) 
  • could not find implicit value for parameter tm: scala.slick.lifted.TypeMapper[Option[justf0rfun.bookmark.model.Task]]
  • not enough arguments for method base: (implicit tm: scala.slick.lifted.TypeMapper[Option[justf0rfun.bookmark.model.Task]])scala.slick.lifted.BaseTypeMapper[Option[Long]]. Unspecified value parameter tm.

主要問題:如何用油滑的解除嵌入和映射表的正確方法?如何讓這個工作?

在此先感謝。

回答

6

簡短的回答是:使用ID代替對象引用,並使用Slick查詢來解引用ID。您可以將查詢放入方法中以供重用。

這將使你的case類是這樣的:

case class Task(id: Option[Long], title: String, nextTaskId: Option[Long]) 
case class TaskList(label: String, firstTaskId: Option[Long]) 

我會發布關於在某個時候這個主題的文章並在此處鏈接。

+0

嗨cvogt,這個限制仍然適用於Slick 2.0嗎?你有沒有參考這種情況應該如何排序?謝謝! –

+0

嗨。你有沒有發表你的文章? – n1r3

+0

不,但它仍然在我的名單上,可能會在夏天之前發生一段時間。我會在Slick郵件列表上公佈它。 – cvogt

相關問題