Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Anorm管理scala枚举?_Scala_Enums_Anorm - Fatal编程技术网

如何使用Anorm管理scala枚举?

如何使用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

我想使用enum创建用户角色(我认为这是最好的主意)

我应该如何进行这项工作

我当前的代码如下所示:

对象用户角色扩展枚举{
类型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]

注意字符串上的匹配,这显然是一个不错的预算,但你明白了

有关更多详细信息,请参见此处的文档