微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Scala Slick 中的可重用表类

如何解决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 举报,一经查实,本站将立刻删除。