如何解决Scala Slick 中的可重用表类
在 Play 应用程序中,我有几个共享相同结构的表和类。我想让它们保持不同以维护应用程序语义(是的静态类型!)。但是,我想避免重复样板代码。
例如,这是 Region
类。
case class Region(id: Int,name:String)
这是它的 Slick 的表查询类:
class RegionsTable(tag:Tag) extends Table[Region](tag,"regions") {
def id = column[Int]("id",O.AutoInc,O.PrimaryKey)
def name = column[String]("name",O.Unique)
def * = (id,name) <> (Region.tupled,Region.unapply)
}
如何避免为共享 Region
结构的每个其他类复制表查询类?
解决方法
也许不是很流畅的原生解决方案,但重构可能看起来像:
import slick.jdbc.H2Profile.api._
import scala.reflect.ClassTag
case class Region(id: Int,name: String)
case class Country(id: Int,name: String)
class IdNameTable[T](tag: Tag,tableName: String,apply: (Int,String) => T,unapply: T => Option[(Int,String)])
(implicit classTag: ClassTag[T]) extends Table[T](tag,tableName) {
def id = column[Int]("id",O.AutoInc,O.PrimaryKey)
def name = column[String]("name",O.Unique)
def * = (id,name) <> (apply.tupled,unapply)
}
class RegionsTable(tag: Tag) extends IdNameTable[Region](tag,"regions",Region,Region.unapply)
class CountryTable(tag: Tag) extends IdNameTable[Country](tag,"country",Country,Country.unapply)
工作 Scatie 示例:https://scastie.scala-lang.org/fR7BzS1jSKSXptE9CTxXyA
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。