9

Slick の持ち上げられた埋め込みとマップされたテーブルに苦労しています。API は私には奇妙に感じられます。おそらく、私にはなじみのない方法で構造化されているためです。

タスク/Todo リストを作成したいと考えています。次の 2 つのエンティティがあります。

  • タスク: 各タスクには、次のタスクへのオプションの参照があります。このようにして、リンクされたリストが構築されます。その意図は、ユーザーが自分の優先順位に従ってタスクを順序付けできるようにすることです。この順序は、タスクからタスクへの参照によって表されます。
  • TaskList: ラベルとリストの最初のタスクへの参照を持つ TaskList を表します。

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


ここで、これら 2 つのエンティティのデータ アクセス オブジェクト (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 _)
  }

残念ながら、それはコンパイルされません。問題は、それぞれ*での両方のテーブルの射影にあります。nextTaskfirstTask

  • 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.

主な質問: Slick の持ち上げられた埋め込みとマップされたテーブルを正しい方法で使用するにはどうすればよいですか? これを機能させるにはどうすればよいですか?

前もって感謝します。

4

1 に答える 1

6

簡単に言えば、オブジェクト参照の代わりに ID を使用し、Slick クエリを使用して ID を逆参照することです。再利用するためにクエリをメソッドに入れることができます。

これにより、ケース クラスは次のようになります。

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

いつかこのトピックに関する記事を公開し、ここにリンクします。

于 2013-07-25T22:25:28.463 に答える