Предположим, что у меня есть следующая черта.
trait ModelTrait{
def id: Option[Long]
def name: String
}
И у меня есть две таблицы. Их классы case и поля tableQuery показаны ниже.
val modelOneTable = TableQuery[ModelOnes]
val modelTwoTable = TableQuery[ModelTwos]
case class ModelOne(id: Option[Long], name: String) extends ModelTrait
case class ModelTwo(id: Option[Long], name: String) extends ModelTrait
Я хотел бы создать функцию, которая, в зависимости от ввода, возвращает одно из полей tableQuery. Что-то вроде этого:
def getTableQuery(which: String): TableQuery[Table[ModelTrait]] = {
which match {
case "One" => modelOneTable
case _ => modelTwoTable
}
Обратите внимание, что modelOneTable
- TableQuery[ModelOnes]
. Класс ModelOnes
(с s) расширяет Table[ModelOne]
. Это то же самое для ModelTwo
. Следовательно, почему функция возвращает TableQuery[Table[ModelTrait]]
.
class ModelOnes(tag: Tag) extends Table[ModelOne](tag, "modelOnes") {
// ...
}
class ModelTwos(tag: Tag) extends Table[ModelTwo](tag, "modelTwos") {
// ...
}
Но я получаю ошибки несоответствия типа в моих заявлениях о случаях. Может ли кто-нибудь помочь?
Вам нужно указать аргумент case для других строк:
which match {
case "One" => modelOneTable
case "Two" => modelTwoTable
case _ => ... // which TableQuery should be returned for other strings
}
TableQuery
?build.sbt
файл"com.typesafe.slick" %% "slick" % "3.2.3"