2015-05-18 3 views
0

При использовании формы Slick CaseClass в настоящее время я сталкиваюсь с ситуацией, когда по соображениям эффективности предложения groupBy мне нужны три столбца, которые будут храниться в реляционной модели, тогда как только два поля существуют в моей объектно-ориентированная модель (третий вычисляемой)CaseClassShape для модели с вычисленными свойствами

case class MyEntry(quantity:Double, time:LocalDateTime){ 

    val weight = time.getHour match { 
    case x if x>=7 && x<=23 => 0.1 
    case _ => 0.05 
    } 

} 

case class LiftedMyTuple(quantity:Rep[Double],time:Rep[LocalDateTime], weight:Rep[Double]) 

implicit object MyEntryShape extends CaseClassShape(???,???) 

class MyTableRow(tag:Tag) extends Table[MyEntry](tag, "MY_TABLE"){ 

    def quantity = column[Double]("QUANTITY") 

    def time = column[LocalDateTime]("TIME",O.PrimaryKey) 

    def weight = column[Double]("WEIGHT") 

    def * = LiftedMyTuple(quantity,time,weight) 

} 

Как можно написать CaseClassShape для такого использования, где класс случае имеет вычисленное свойство, которое должно отображаться в реляционной модели?

+0

Вы пробовали: 'case class MyEntry (количество: Double, time: LocalDateTime, _ignoreStoredWeight: Double) {...}'? – cvogt

ответ

1

Похоже, что конструктор CaseClassShape(mapLifted: (LiftedTuple) ⇒ LiftedCaseClass, mapPlain: (PlainTuple) ⇒ PlainCaseClass)

Мы должны быть в состоянии удовлетворить, что как это:

object myShape extends 
    CaseClassShape(
    LiftedMyTuple.tupled, 
    { (quantity, time, ignored) => MyEntry(quantity, time) } 
) 

Если вы изменить свой случай класс для хранения веса, но обеспечить конструктор, который вычисляет его, вы может получать поведение read-from-db на стороне кода db-> и вычислять поведение на стороне code-> db.

object MyEntry { 
    def apply(quantity: Double, time: LocalDateTime) = { 
    val weight = time.getHour match { 
     case x if x>=7 && x<=23 => 0.1 
     case _ => 0.05 
    } 
    MyEntry(quantity, time, weight) 
    } 
} 
case class MyEntry(quantity: Double, time: LocalDateTime, weight: Double) 

object myShape extends CaseClassShape(LiftedMyTuple.tupled, MyShape.apply.tupled) 

val example = MyShape(0.0, now) // computes weight 

Обратите внимание, что я звоню MyShape.apply явно вместо MyShape - потому что мы создали новый метод применять компилятор больше не будет автоматически сделать вывод, что MyShape означает MyShape.apply (когда он передается как функция).

+0

Это решение - это то, что я реализовал, хотя мне было интересно, в чем стратегия борьбы с несогласованностью? – Edmondo1984

+0

Какая непоследовательность? – Daenyth

+0

Если значение в моей таблице отличается от значения, которое я вычисляю в моем случае, класс – Edmondo1984

Смежные вопросы