0

多くのテーブルがすべて同じ列を必要とする状況があります。

  • 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 生成を使用してこれを達成する方法はありますか?

4

1 に答える 1

0

def *または overrideでそれらすべてに言及する必要がありますdef create_*。それを追加して、ケースクラスにマップする列が少ないdef *別の列を作成することをお勧めします。def forWebを使用clients.map(_.forWeb)すると、クエリでこれらの列を取得できます。書くこともできますclients.map(_.forWeb).update( ... )

于 2013-09-20T11:43:53.670 に答える