如何在Scala Slick 3中实现枚举?

13

这个问题已经在slick 1和2中得到了解答,但是这些答案似乎对于slick 3无效。

尝试使用如何在Scala Slick中使用枚举?中的模式,

object MyEnumMapper {
  val string_enum_mapping:Map[String,MyEnum] = Map(
     "a" -> MyEnumA,
     "b" -> MyEnumB,
     "c" -> MyEnumC
  )
  val enum_string_mapping:Map[MyEnum,String] = string_enum_mapping.map(_.swap)
  implicit val myEnumStringMapper = MappedTypeMapper.base[MyEnum,String](
    e => enum_string_mapping(e),
    s => string_enum_mapping(s)
  )
}

但是自Slick 1以来,MappedTypeMapper就不再可用了,虽然在文档中有记录,但是在Slick 2中建议使用的MappedColumnType也已经不再可用。

那么现在有什么最佳实践呢?


MappedColumnType 仍然可用,我在 slick 3.0 中经常使用它。 - Krever
2个回答

19

您所说的MappedColumnType不再可用是什么意思?它随着驱动程序的常规导入一起提供。使用MappedColumnType将枚举映射到字符串,反之亦然,非常直观:

object MyEnum extends Enumeration {
  type MyEnum = Value
  val A = Value("a")
  val B = Value("b")
  val C = Value("c")
}

implicit val myEnumMapper = MappedColumnType.base[MyEnum, String](
  e => e.toString,
  s => MyEnum.withName(s)
)

抱歉,我现在不确定为什么我认为那是这样的。 - kbanman
隐式映射器应该放在枚举对象内部,不是吗? - Cedric Reichenbach
2
@CedricReichenbach 这只是一个例子。您可以将其放置在任何位置,只需确保在需要时编译器可以访问到它。 - Roman

2

以下是简短的答案,您无需自己实现myEnumMapper:

import play.api.libs.json.{Reads, Writes}

object MyEnum extends Enumeration {
  type MyEnum = Value
  val A, B, C = Value // if you want to use a,b,c instead, feel free to do it

  implicit val readsMyEnum = Reads.enumNameReads(MyEnum)
  implicit val writesMyEnum = Writes.enumNameWrites
}

3
这是如何工作的?Slick是否会自动获取JSON Reads? - Thilo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接