如何强制浮动为继承列生成ddl

时间:2013-09-19 20:45:52

标签: scala playframework slick playframework-evolutions

我的情况是,我的许多表都需要相同的列:

  • ID:长
  • 创建的:时间戳

然而,“创建”列从未被网络使用,“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)
  )
}

现在问题是,我不希望将'created'列返回到Web,这就是为什么它不包含在Client case类,默认投影或控制器表单中。我只是想把它设置在创作上,所以我所做的就是:

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的任何表的

列。如果我手动添加“创建”列一切正常。有没有办法仍然使用光滑的ddl生成并实现这一目标?

1 个答案:

答案 0 :(得分:0)

您需要在def *中提及所有这些内容或覆盖def create_*。我建议您将其添加到def *,然后使用较少的列映射到案例类,编写另一个def forWeb。使用clients.map(_.forWeb),您可以在查询中获取这些列。您也可以写clients.map(_.forWeb).update( ... )