/ / Slick 3.0.0 Mapowanie istniejących modeli - scala, slick

Zręczne 3.0.0 Mapowanie istniejących modeli - scala, slick

Mam model, który składa się z trzech klas przypadków jak poniżej:

case class MyModel(myId: MyIdType, name: MyNameType)

case class MyIdType(id: Long)
case class MyNameType(name: String)
object MyNameType(name: String) {
val NAME1 = MyNameType("name1")
val NAME2 = MyNameType("name2")
val NAME3 = MyNameType("name3")
}

Powiedzmy, że są to istniejące modele. Mam mapowanie zręcznego tabel, które wygląda następująco:

  class MyTable(tag: Tag) extends Table[MyTableElem](tag, "myTable") {
def id                  = column[Long]("id", O.PrimaryKey)
def name                = column[String]("name")

def * = (id, name) <> (MyTableElem.tupled, MyTableElem.unapply)
}

Jak widać, muszę mieć kolejnąwpisz, aby zmapować mój tabelę MyTable najpierw na MyTableElem, a następnie podczas każdego odczytu przekształcam MyTableElem na MyModel. Czy istnieje sposób, aby tego uniknąć i przejść bezpośrednio do MyModel? Wydaje mi się, że muszę zaimplementować metody krotności i nieskuteczne lub?

Odpowiedzi:

1 dla odpowiedzi № 1

Myślę, że być może trzeba będzie zdefiniować własny typ kolumny. W dokumentacji Slick 3.0 Używanie niestandardowych typów skalarnych w zapytaniach, MappedTo może być użyty w twoim przypadku.

Jeśli masz klasę opakowania (która może opcjonalniebyć klasą case i / lub klasą wartości) dla wartości bazowej niektórych obsługiwanych typów, możesz zmusić ją do rozszerzenia MappedTo, aby uzyskać generowany makrowo niejawny ColumnType za darmo.

Oto jak próbuję rozwiązać Twój problem.

import slick.lifted.Tag
// I am using PostgreSQL
import slick.driver.PostgresDriver.api._

case class MyModel(myId: MyIdType, name: MyNameType)

case class MyIdType(id: Long) extends MappedTo[Long] {
override def value: Long = id
}
case class MyNameType(name: String) extends MappedTo[String] {
override def value: String = name
}

class MyTable(tag: Tag) extends Table[MyModel](tag, "myTable") {
def id                  = column[MyIdType]("id", O.PrimaryKey)
def name                = column[MyNameType]("name")

def * = (id, name) <> (MyModel.tupled, MyModel.unapply)
}

W każdym razie, mam nadzieję, że to pomaga.