Как добавить методы в таблицы Slick?

Я хотел бы сделать что-то подобное, используя 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?


person scand1sk    schedule 26.12.2014    source источник


Ответы (1)


Пока вы можете выразить это с помощью 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)
person cvogt    schedule 27.12.2014