Bonjour les lyonnais,
Petite question pratique sous Slick,
nous sommes en train de refaire toutes notre architecture sous Scala Slick / Maria DB.
Sur mes tables j'aimerais placer des comportements communs comme les champs created, updated mis à jour automatiquement sur mes tables.
Pour faire ceci j'ai donc fait un Table Commune pour la base de donnée.
abstract class TableLaboratoryAble[T](tag: Tag, name: String) extends Table[T](tag, name) {
/**
* ID
*/
val id: Column[Long] = column[Long]("id", O.PrimaryKey, O.AutoInc)
/** LaboratoryId **/
val laboratoryId: Column[Long] = column[Long]("laboratory_id", O.NotNull)
/** LaboratoryId FK and INDEX **/
lazy val laboratoryFk = foreignKey("LAB_FK_" + name, laboratoryId :: HNil, LaboratoryQueries.instance)(r => r.id :: HNil, onUpdate = ForeignKeyAction.NoAction, onDelete = ForeignKeyAction.NoAction)
val index1 = index("LAB_INDEX_" + name, laboratoryId :: HNil)
/** TemporalAble **/
def temporal = (created, updated) <>((Temporal.apply _).tupled, Temporal.unapply)
val created: Column[DateTime] = column[DateTime]("created")
val updated: Column[DateTime] = column[DateTime]("updated")
}
Ensuite je me suis fait une case Class commune qui va avoir les champs communs created, updated.
case class Temporal(created:DateTime, updated:DateTime)
Mon problème vient du fait que lorsque je fait des méthodes générique d'insertion je ne peux pas utiliser la méthode copy des case class du coup je suis obligé d'overrider une méthode onSave à chaque fois pour mes case classe finale.
case class Crud(implicit currentLaboId: Long, session: Session) {
def query =
_tableReference.filter(_.laboratoryId === currentLaboId)
def insert(row: A) = {
_tableReference.insert(row.onSave)
}
}Et voici la case class Finale :
case class LaboratoryConfigRow(id:Long,laboratoryId:Long,
temporal: Temporal) extends TemporalAble[LaboratoryConfigRow] {
override def onSave = this.copy(temporal = Temporal.updatedAt(this.temporal))
}
Si quelqu'un à une idée pour améliorer la chose (Ne pas être obligé de overrider la méthode à chaque fois) ça serait vraiment super.