Нет ничего хуже, чем оставшийся без ответа вопрос о переполнении стека! Таким образом, вот как я решил эту проблему.
Метод, над которым я работал, оказался верным, я просто немного ошибся в своих генериках. Рабочая версия выглядит так:
def tableView[T <: ClientTable[E], E <: ClientColumn](tableQuery: TableQuery[T], clientId: Option[Int]): Query[T, T#TableElementType, Seq] = {
clientId match {
case Some(id) => tableQuery.filter(_.client === id)
case None => tableQuery
}
}
В определениях таблиц вам необходимо расширить тип Table
с помощью реализации, в которой есть столбец client
:
abstract class ClientTable[T](tag: Tag, name: String) extends Table[T](tag, name) {
def client: Rep[Option[Int]] = column[Option[Int]]("client")
}
и расширяйте ваши классы падежей строк признаком, который добавляет поле client
ко всем из них как таковое
trait ClientColumn {
def client: Option[Int]
}
case class Feed(id: Int = 0,
name: String,
...
client: Option[Int]) extends ClientColumn
Теперь метод tableView
будет работать должным образом, хотя, по-видимому, только при передаче параметров типа, например, val x = tableView[X, x](TableQuery[X], client)
, поскольку, похоже, Scala не может определить типы обоих общих параметров.
Одна вещь, о которой стоит упомянуть, это то, что я не использую Slick для создания своей таблицы или операторов ddl, вместо этого я использую flyway. Использование этого метода с abstract class
и trait
может не работать в этом случае.
В любом случае, удачи всем, кто найдет этот вопрос и ответ в будущем!