scala - 如何使用 Anorm 管理 Scala 枚举?

标签 scala enums anorm

我想通过使用枚举来创建用户角色(认为这是最好的主意)。

我该如何处理?

我当前的代码如下所示:

object UserRole extends Enumeration {
  type UserRole = Value
  val admin, user, manager = Value
}    
case class User(id: Long, firstname: String, lastname: String, password: String, email: String, role: UserRole)

那么我应该如何定义用户“简单”:

val simple = {
    get[Long]("user.id") ~
      get[String]("user.firstname") ~
      get[String]("user.lastname") ~
      get[String]("user.password") ~
      get[String]("user.email") ~
      get[UserRole]("user.role")  map {
      case id~firstname~lastname~password~email~role => User(id, firstname, lastname, password, email, role)
    }
  }

我应该如何将它保存到数据库?

CREATE TABLE user (
    id integer NOT NULL DEFAULT nextval('user_id_seq'),
    firstname varchar(60),
    lastname varchar(60),
    password varchar(255),
    email varchar(60),
    role varchar(40)
);

最佳答案

Anorm 不支持 Scala 枚举(在我看来,Scala 枚举非常糟糕)。我通常做的是创建另一个具有自己的解析器和表空间的案例类,并将其JOIN 到相关查询。 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)
        }
    }

}

关于scala - 如何使用 Anorm 管理 Scala 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24213468/

相关文章:

java - 运行具有外部依赖项的 Scala 脚本

scala - Apache Spark RDD - 不更新

c++ - 将一个作用域中的枚举作为函数参数传递给另一个作用域

c++ - 为枚举类型赋值

c# - const int 列表而不是枚举

scala - 如何动态生成大数据流

postgresql - 在 PostgreSQL 9.0 中破坏的 Anorm 使用 Order By 选择?

scala - 有没有一种简单的方法来获取 Stream 作为 RowParser 的输出?

scala - 我如何在 Play 控制台中使用 ANORM?

scala 22 参数和更多参数 *