如何向Slick表添加方法?

时间:2014-12-26 21:01:42

标签: scala slick slick-3.0

我想使用Slick执行类似的操作(我已更新为3.0.0-M1):

class MyTable extends Table[(Int, Int)](tag, "MyTable) {
   def a = column[Int]("a")
   def b = column[Int]("b")

   def * = (a, b)

   def total: Int = a + b   // That's THE thing
}

以便我以后可以执行:

val values = TableQuery[MyTable]
values.map(_.total)

当然,我坚持使用total方法。 total方法可能相当复杂(我有一个应用程序,它应该计算三个计数的中位数),所以我认为它应该是最终要执行的实际Scala代码。

如何在Slick中开发出类似的内容?

1 个答案:

答案 0 :(得分:3)

只要您可以使用Slick表达它,例如

def total/*: Column[Int]*/ = a + b

它将在服务器端运行。您可以使用隐式类从外部修补方法,而不是将其放在Table子类中:

implicit class ExtendMyTable(t: MyTable){
  def total/*: Column[Int]*/ = t.a + t.b
}

只需要在您尝试调用.total的范围内。或者,如果您确实需要客户端Scala编码,请改为扩展结果类型,例如

implicit class ExtendMyTableResult(t: (Int,Int)){
  def total/*: Int*/ = t._1 + t._2
}

然后再做

TableQuery[MyTable].run.map(_.total)