多くのテーブルがすべて同じ列を必要とする状況があります。
- id:ロング
- 作成:タイムスタンプ
ただし、「作成された」列は Web では使用されません。「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)
)
}
問題は、「作成された」列が Web に返されることを望んでいないため、クライアント ケース クラス、デフォルト プロジェクション、またはコントローラー フォームに含まれていないことです。作成時に設定したいだけなので、私がやったことは次のとおりです。
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 生成を使用してこれを達成する方法はありますか?