我正在开发一个使用 Slick 1.0 和 cake 模式连接到 postgresql 数据库的项目。
就像现在一样,一切似乎都运行良好,但我还有很多表要添加,并且我意识到所有表都包含许多公共列。我希望能够制作一个包含公共字段的特征,但我无法弄清楚如何让它发挥作用。(我是 scala 的新手,但我认为我的基础知识已经很好了。)
这是一个示例,希望能说明我想要做什么:
一.scala:
package models.db.slick
import java.util.UUID
import play.api.db.slick.Profile
case class One(common1:UUID, common2:String, unique1:String)
trait OneComponent{this: Profile =>
import profile.simple._
object Ones extends Table[One]("One") with CommonColumns{
def unique1 = column[String]("unique1")
def * = common1 ~ common2 ~ unique1 <> (One.apply _, One.unapply _)
}
}
ColumnColumns.scala:
package models.db.slick
import java.util.UUID
import play.api.db.slick.Profile
trait CommonColumns{
def common1 = column[UUID]("common1")
def common2 = column[String]("common2")
}
这不会编译,因为 ColumnColumns 特征不知道 column[T]。我尝试指定一个 self 类型的 Table,但我不知道如何获取 Table 对象,该对象本身位于 scala.slick.driver.BasicTableComponent 特征中。我还尝试指定一个实现列函数的 self 类型,例如:
trait CommonColumns{ this => {def column[C](n: String, options:
scala.slick.lifted.ColumnOption[C]* )
(implicit tm:scala.slick.lifted.TypeMapper[C]
): scala.slick.lifted.Column[C]}
...
}
但这不起作用。我很可能在那个语法上有错误,但我找不到一个很好的例子来说明如何做到这一点。
你怎么看?有什么好方法可以完成这项工作吗?