Я новичок в scala & slick.
Как часть интерфейса, который я пытаюсь реализовать, мне нужно определить абстрактное поле таблицы БД. Эта таблица содержит записи экземпляров.
Эти экземпляры могут различаться, и все они имеют общий интерфейс.
Минимизированный (и, возможно, глупый) пример моей проблемы:
import slick.lifted.{ProvenShape, Tag}
import slick.jdbc.PostgresProfile.api._
trait Fruit {
def color: String
def weight: Float
}
trait SomeAction[A <: Fruit] {
// The following definition is problematic for me:
def table: Table[A]
/*
Not sure how to annotate that definition:
def table[B]: TableQuery[B <: Table[A]]
def table: TableQuery[Table[A]]
def table: Table[A]
have all failed.
Mind the desired implementation of the sub classes of that field.
*/
def insertIfNotExists(fruit: A)(implicit ec: ExecutionContext) = {
table.filter(_.column("id") === fruit.weight).exists.result.flatMap {exists =>
if (exists)
DBIO.successful(None)
else
table += fruit
}
// ...
}
}
case class Apple(color: String, weight: Float, seeds: Int) extends Fruit
class ApplesTable(tag: Tag) extends Table[Apple](tag, "apples") {
def color: Rep[String] = column[String]("color")
def weight: Rep[Float] = column[Float]("weight")
def seeds: Rep[Int] = column[Int]("seeds")
def * : ProvenShape[Apple] = (color, weight, seeds) <> ((Apple.apply _).tupled, Apple.unapply)
}
class AppleAction extends SomeAction[Apple] {
override def table = TableQuery[ApplesTable]
}
case class Banana(color: String, weight: Float) extends Fruit
class BananasTable(tag: Tag) extends Table[Banana](tag, "bananas") {
def color: Rep[String] = column[String]("color")
def weight: Rep[Float] = column[Float]("weight")
def * : ProvenShape[Banana] = (color, weight) <> ((Banana.apply _).tupled, Banana.unapply)
}
class BananaAction extends SomeAction[Banana] {
override def table = TableQuery[BananasTable]
}
Есть ли способ определить такое поле таблицы каким-нибудь обобщенным образом? Если это так, я буду рад узнать, что я сделал не так.
Большое спасибо Q