如何使用Anorm管理scala枚举?
我想使用enum创建用户角色(我认为这是最好的主意) 我应该如何进行这项工作 我当前的代码如下所示:如何使用Anorm管理scala枚举?,scala,enums,anorm,Scala,Enums,Anorm,我想使用enum创建用户角色(我认为这是最好的主意) 我应该如何进行这项工作 我当前的代码如下所示: 对象用户角色扩展枚举{ 类型UserRole=Value val admin、user、manager=Value } 案例类用户(id:Long,firstname:String,lastname:String,password:String,email:String,role:UserRole) 那么,我应该如何定义用户“简单”: val simple={ 获取[Long](“us
对象用户角色扩展枚举{
类型UserRole=Value
val admin、user、manager=Value
}
案例类用户(id:Long,firstname:String,lastname:String,password:String,email:String,role:UserRole)
那么,我应该如何定义用户“简单”:
val simple={
获取[Long](“user.id”)~
获取[字符串](“user.firstname”)~
获取[字符串](“user.lastname”)~
获取[String](“user.password”)~
获取[字符串](“user.email”)~
获取[UserRole](“user.role”)映射{
案例id~firstname~lastname~密码~email~role=>User(id、firstname、lastname、密码、电子邮件、角色)
}
}
我应该如何将其保存到数据库
创建表用户(
id integer NOT NULL默认值nextval('user_id_seq'),
名字叫瓦查尔(60岁),
姓氏varchar(60),
密码varchar(255),
电邮varchar(60),
角色varchar(40)
);
Anorm不支持scala枚举(在我看来,scala枚举非常糟糕)。我通常会用自己的解析器和表空间创建另一个case类,然后将它连接到相关查询。UserRole
可以在User
中解析,方法是在User.simple
中组合它
case class UserRole(id: Long, name: String)
object UserRole {
val simple: RowParser[UserRole] = {
get[Long]("roles.id") ~
get[String]("roles.name") map {
case id~name => UserRole(id, name)
}
}
}
case class User(id: Long, firstname: String, lastname: String, password: String, email: String, role: UserRole)
object User {
val simple: RowParser[User] = {
get[Long]("user.id") ~
get[String]("user.firstname") ~
get[String]("user.lastname") ~
get[String]("user.password") ~
get[String]("user.email") ~
UserRole.simple map {
case id~firstname~lastname~password~email~role =>
User(id, firstname, lastname, password, email, role)
}
}
}
作为另一种选择,你可以用一种封闭的特质来塑造你的角色
sealed trait UserRole
case object Admin extends UserRole
case object User extends UserRole
case object Manager extends UserRole
然后为你的类型提供一个anorm阅读器
implicit val column: Column[UserRole] = {
Column.nonNull1 { (value, meta) =>
val MetaDataItem(qualified, nullable, clazz) = meta
value match {
case "Admin" => Right(Admin)
case "User" => Right(User)
case "Manager" => Right(Manager)
case unknown => Left(TypeDoesNotMatch(s"unknown UserRole from $unknown"))
}
}
}
然后可以在行解析器中使用该类型,如get[UserRole]
注意字符串上的匹配,这显然是一个不错的预算,但你明白了
有关更多详细信息,请参见此处的文档