【问题标题】:How to implement enums in scala slick 3?如何在 scala slick 3 中实现枚举?
【发布时间】:2015-07-30 00:06:34
【问题描述】:

已针对 slick 1 和 2 提出并回答了此问题,但答案似乎对 slick 3 无效。

尝试使用How to use Enums in 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)
  )
}

MappedTypeMapper 自 slick 1 以来一直不可用,并且建议的用于 slick 2 的 MappedColumnType 不再可用,尽管已记录 here

这方面的最新最佳做法是什么?

【问题讨论】:

  • MappedColumnType 仍然可用,我经常在 slick 3.0 中使用它

标签: database scala enums slick


【解决方案1】:

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)
)

【讨论】:

  • 我的错,我现在不知道为什么我会这么认为。
  • 隐式映射器应该位于枚举对象内部,不是吗?
  • @CedricReichenbach 这只是一个例子。你可以把它放在任何你喜欢的地方,只要确保它在需要时在编译器的范围内。
【解决方案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
}

【讨论】:

  • 这是如何工作的? Slick 会以某种方式自动获取 JSON 读取吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多