Slick中的Scala枚举(case对象),良好的实践

4
假设我有一个表示多个有效状态的特质。将对象存储在数据库中是一个好的做法吗?使用隐式函数 MappedColumnType.base[Int, DoorState] 将 Int 存储并映射到 DoorState,这样做是否更好?
trait DoorState
case object Open extends DoorState
case object Closed extends DoorState

class Doors(tag: Tag) extends Table[Door](tag, "DOORS") {
  ...
  def state = column[DoorState]("DOOR_STATE")
  ...
}

如果不将对象映射到数据库的整数/枚举,那么“存储对象”是什么意思? - cvogt
我的意思是哪种方式更好,是存储一个列[DoorState]还是存储一个列[Int],然后再转换为DoorState。我可能不太了解Slick如何存储DoorState。我想Slick处理DoorState和Int的存储方式之间存在差异。 - Jorge Vicente Cantero
1个回答

5

制造商建议使用:

implicit def doorStateMapper = MappedColumnType.base[DoorState, Int]( ... )

为了将您的案例对象和int(我假设是您的数据库列的类型)进行映射,需要在表格和查询范围内。您还可以映射到字符串或其他内容。MySQL ENUM就像映射到String一样。请参见http://slick.typesafe.com/doc/2.1.0/userdefined.html#using-custom-scalar-types-in-queries

然后,您就可以将DoorState作为Column类型使用,如:

column[DoorState]Column[DoorState]


谢谢,这正是我想要的。我误解了Slick存储自定义类的方式。 - Jorge Vicente Cantero

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