如何在Scala的Slick中将“y”/“n”列映射到布尔值?

时间:2013-10-26 10:35:20

标签: string scala mapping boolean slick

我是Scala和Slick的新手,我找到了this built-in type mapper from AnyType to Boolean。我需要将“y”映射为true,将“n”映射为false,这似乎很简单。有人可以告诉我如何使用它吗?我目前的代码是这样的,重新发明轮子:

    sealed trait YesNoBoolean
    case object True extends YesNoBoolean
    case object False extends YesNoBoolean

    implicit val boolTypeMapper = MappedColumnType.base[YesNoBoolean, String](
      { b =>
        assertNotNull(b)
        if(b == True) "y" else "n"
      }, { i =>
        assertNotNull(i)
        if(i == "y") True else False
      }
    )

我实际上需要映射到真正的布尔类型。我有几个列使用这个邪恶的方案(来自PHP的遗产)。

我想我需要在表定义中执行此操作:

object Record extends Table[(Int,YesNoBoolean)]("record") {
  def is_usable_entry = column[YesNoBoolean]("usable_entry", O.DBType("enum('y','n')"))
...
}

1 个答案:

答案 0 :(得分:1)

试试这个

def is_usable_entry = column[Boolean]
  ("usable_entry",O.DBType("enum('y','n')"))(
    MappedColumnType.base[Boolean, String](
      if(_) "y" else "n",_=="y"
    )
  )

如果这不起作用,您可能需要拔出类型映射器并使其隐式。在这种情况下,您可能必须从导入(booleanColumnType => _)中排除布尔值的其他隐式类型映射器。