我正在开发一个使用Slick 1.0和蛋糕模式连接到postgresql数据库的项目 就像现在一样,一切似乎都运行良好,但我有更多的表要添加,我意识到所有表都包含许多常见的列。我希望能够创建一个包含常见字段的特征,但我无法弄清楚如何使其工作。 (我在scala上相当新,但我认为我的基础知识非常好。)
这是一个有希望说明我想做的事情的例子:
One.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特征不知道列[T]。我尝试指定一个自我类型的表,但我无法弄清楚如何到达它本身在scala.slick.driver.BasicTableComponent特性中的Table对象。我还试图指定一个实现列函数的自我类型,如:
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]}
...
}
但这不起作用。我很可能在那个语法上有错误的语法,但我找不到如何做到这一点的好例子。
你怎么看?有没有一个很好的方法来完成这个?答案 0 :(得分:3)
我明白了! 至少我想我做到了。如果有人注意到这个问题,请告诉我。
好的,我的表现就是这样:
我将CommonColumns特性更改为:
trait CommonColumnsComponent{ this:Profile =>
import profile.simple._
trait CommonColumns{ this:Table[_] =>
def common1 = column[UUID]("common1")
def common2 = column[String]("common2")
}
}
然后我将OneComponent更改为:
trait OneComponent extends CommonColumnsComponent{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 _)
}
}
并且有效。