Как заставить слик генерировать ddl для унаследованных столбцов

У меня есть ситуация, когда для всех моих таблиц требуются одинаковые столбцы:

  • ID: Длинные
  • создано: Отметка

Столбец "создал", однако, никогда не используется в сети, а "идентификатор".

Для этого я использовал абстрактный класс и объект:

abstract class BaseObject{ 
    val id:Option[Long]
}

abstract class BaseTable[T <: BaseObject](tableName: String) extends Table[T](None, tableName) {
 def this() {
    this("BaseTable")
  }

  def id = column[Long]("id", O.PrimaryKey, O.AutoInc)

  def created = column[Timestamp]("created",O.NotNull)

  def autoInc = * returning id
}

Затем я реализовал конкретный клиент:

case class Client(id: Option[Long] = None, name: String = "", contact: String = "", phone: String = "", email: String = "") extends BaseObject
object Clients extends BaseTable[Client]("CLIENT") {
  def name = column[String]("name", O.NotNull)

  def contact = column[String]("contact")

  def phone = column[String]("phone")

  def email = column[String]("email")

  def * = id.? ~ name ~ contact ~ phone ~ email <>(Client.apply _, Client.unapply _)
}

А затем вот часть ClientController:

object ClientController extends Controller {
 val form = Form(
    mapping(
      "id" -> optional(longNumber),
      "name" -> nonEmptyText,
      "contact" -> text,
      "phone" -> text,
      "email" -> text
    )(Client.apply)(Client.unapply)
  )
}

Дело в том, что я никогда не хочу, чтобы "созданный" столбец возвращался в Интернет, поэтому он не включен в класс дел клиента, проекцию по умолчанию или форму контроллера. Я просто хочу установить его на создание, поэтому я сделал следующее:

def doUpdate(client: Client)(implicit s: Session): Client = {
    if (client.id.isDefined) {
      Clients.where(_.id === obj.id).update(client)
    } else {
      Clients.autoInc.insert(obj)
      Clients.where(_.id === updated.get).map(_.created).update(new Timestamp(System.currentTimeMillis()))
    }
   client
  }

Моя проблема в том, что пятно не будет генерировать "создано"

столбец для любой из таблиц, расширяющих BaseTable. Если я добавлю столбец "создал" вручную, все работает нормально. Есть ли способ по-прежнему использовать Slick DDL поколения и достичь этого?

1 ответ

Вы должны упомянуть все из них в def * или переопределить def create_*, Я предлагаю вам добавить его в def * и напиши другой def forWeb с меньшим количеством столбцов, которые вы сопоставляете с классом дел. С помощью clients.map(_.forWeb) Вы можете получить эти столбцы в запросе. Вы также можете написать clients.map(_.forWeb).update( ... )

Другие вопросы по тегам