デフォルトでマッピングできるのはプリミティブ型のみです。Enum を含め、それ以外の独自定義型をマッピングする場合は MappedColumnType を使い、マッピングの関数定義が必要です。詳細は公式ドキュメントの「USER-DEFINED FEATURES」を参照してください。
注)手元の環境は以下です。
- Scala 2.11.6
- Slick 3.1.0
列挙型 の定義
マッピング対象の列挙型として以下があるとします。
// 文字列型 にマッピングするEnum
object Color extends Enumeration {
type Color = Value
val Blue = Value("Blue")
val Red = Value("Red")
val Green = Value("Green")
}
// 整数型にマッピングするEnum
object Bar extends Enumeration {
type Bar = Value
val b1 = Value
val b2 = Value
val b3 = Value
}
Slick でのテーブル定義
column定義の箇所で、普通に独自定義の Enumeration が使えます。MappedColumnType を使い、implicit なマッピング関数を定義している点に注意してください。こういうマッピングを独自定義型に対して書く必要があります。
class SampleTable(tag: Tag) extends Table[Sample](tag, "Sample") {
def name = column[String]("NAME")
def id = column[Int]("ID")
def color = column[Color]("COLOR")
def bar = column[Bar]("BAR")
def * = (name, id, color, bar) <> (Sample.tupled, Sample.unapply)
}
implicit val colorMapper = MappedColumnType.base[Color, String](
e => e.toString,
s => Color.withName(s)
)
implicit val barMapper = MappedColumnType.base[Bar, Int](
e => e.id,
i => Bar.apply(i)
)