Аннотировать таблицу согласно варианту - PullRequest
0 голосов
/ 20 апреля 2020

Я новичок в 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

...