2015-01-20 2 views
2

У меня есть следующие типы перечисления.Общая функция отображения для обработки типов перечисления

class Payment extends Enumeration { 
    type Payment = Value 
    val Cash, CreditCard, Unspecified = Value 
} 
object Payment extends Payment 

class Ticket extends Enumeration { 
    type Ticket = Value 
    val Normal, Discount, Other = Value 
} 
object Ticket extends Ticket 

Я объявил перечисления как классы вместо объектов, как я необходима информация о типе позже (для MappedColumnType).

Вот нерабочая версия скользких таблиц:

class Stats(tag: Tag) extends Table[Stat](tag, "STATS") { 

    implicit def enumToInt[E <: Enumeration : ClassTag, V : ClassTag](implicit conv: V => E#Value): BaseColumnType[V] = 
    MappedColumnType.base[V, Int] (
     value => value.id, 
     num => implicitly[ClassTag[E]].runtimeClass.newInstance().asInstanceOf[E](num).asInstanceOf[V] 
    ) 

    def entityid = column[Int]("ENTITYID") 
    def email = column[String]("EMAIL") 
    def payment = column[Payment]("PAYMENT") 
    def ticket = column[Ticket]("TICKET") 
    def phone = column[String]("PHONE") 
    def ticket_source = column[TicketSource]("TICKETSOURCE") 

    def * = (entityid, email, payment, ticket, phone, ticket_source) <> 
    (Stat.tupled, Stat.unapply) 
} 

Моей цель определения обобщенной функции картографа, чтобы обрабатывать все перечисления как методы преобразования справедливы для всех типов перечислений (значения для идентификатора , id для значения).

В функции mapper я попытался захватить информацию ClassTag и создать исполняемый экземпляр для вызова метода apply, который возвращает перечисление Value. Мне пришлось добавить .asinstanceOf[V] в результат метода apply, в противном случае ошибка повысится примерно на E#Value не соответствует ожидаемому значению V. Теперь, это то, что я получаю как сообщение об ошибке:

Tables.scala:45: could not find implicit value for parameter tm: scala.slick.ast.TypedType[com.yokyer.tiyatrosever.models.Payment] 
[error] def payment = column[Payment]("PAYMENT") 
[error]        ^
Tables.scala:46: could not find implicit value for parameter tm: scala.slick.ast.TypedType[com.yokyer.tiyatrosever.models.Ticket] 
[error] def ticket = column[Ticket]("TICKET") 

Я новичок в Скале, я поставил кучу рецептов о отражениях, вместе взятых, и интересно, если я делаю что-то в корне неправильно.

ответ

3

вам нужно создать MappedColumnType

import profile.simple._ 

def enumValueMapper(enum: Enumeration) = MappedColumnType.base[enum.Value, String](
    e => e.toString, 
    s => Try(enum.withName(s)).getOrElse(throw new IllegalArgumentException 
             (s"enumeration $s doesn't exist $enum 
             [${enum.values.mkString(",")}]")) 
) 

def enumIdMapper(enum: Enumeration) = MappedColumnType.base[enum.Value, Int](
    e => e.id, 
    i => enum.apply(i) 
) 

, то вы можете использовать

// It convert Enum to Int 
implicit val paymentMapper = enumIdMapper(Payment) 

Или

// It convert Enum to String 
implicit val paymentMapper = enumValueMapper(Payment) 
Смежные вопросы