【问题标题】:Reusable Table classes in Scala SlickScala Slick 中的可重用表类
【发布时间】:2021-02-02 14:35:36
【问题描述】:

在 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 结构的每个其他类重复表查询类?

【问题讨论】:

    标签: scala playframework slick-3.0


    【解决方案1】:

    也许不是很流畅的原生解决方案,但重构可能看起来像:

    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)
    

    工作Sctie示例:https://scastie.scala-lang.org/fR7BzS1jSKSXptE9CTxXyA

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      相关资源
      最近更新 更多