Slick 2.0 Общие CRUD-операции

Я искал, как реализовать общую черту для общего CRUD и других видов операций, я смотрел наэтот а такжеэтот и указанный метод работает хорошо.

То, что я хотел бы иметь, это универсальный метод для вставки, мой класс выглядит следующим образом (не универсальная реализация):

object CampaignModel {
  val campaigns = TableQuery[Campaign]

  def insert(campaign: CampaignRow)(implicit s: Session) = {
    campaigns.insert(campaign)
  }
}

После первой ссылки я попробовал следующее (общая реализация):

trait PostgresGeneric[T <: Table[A], A]  {
  val tableReference = TableQuery[T]

  def insertGeneric(row: ? What type goes here ?)(implicit s: Session) = tableReference.insert(row)

}

Когда я проверяюinsert Метод, похоже, правильный тип должен бытьT#TableElementType но мои знания довольно просты, и я не могу обернуться вокруг типов, я попыталсяT а такжеA и компилятор говорит, что этот стиль не соответствует его характеру.

Другая информация, таблицы генерируются с помощью инструментов для создания гладких таблиц

case class CampaignRow(id: Long, name: Option[String])

/** Table description of table campaign. Objects of this class serve as prototypes for rows in queries. */
class Campaign(tag: Tag) extends Table[CampaignRow](tag, "campaign") {
  def * = (id, name) <>(CampaignRow.tupled, CampaignRow.unapply)

  /** Maps whole row to an option. Useful for outer joins. */
  def ? = (id.?, name).shaped.<>({
    r => import r._; _1.map(_ => CampaignRow.tupled((_1.get, _2)))
  }, (_: Any) => throw new Exception("Inserting into ? projection not supported."))

  /** Database column id AutoInc, PrimaryKey */
  val id: Column[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
  /** Database column name  */
  val name: Column[Option[String]] = column[Option[String]]("name")
}

Ответы на вопрос(1)

Ваш ответ на вопрос