【问题标题】:Slick projection <> to a trait with companion object光滑的投影 <> 到带有伴生对象的特征
【发布时间】:2017-11-07 15:15:15
【问题描述】:

我是 Scala 和 Slick 的新手,在实现用户帐户时遇到了一些问题。

用户类和伴随对象:

case class User(id: Long, email: String, password: String, role: Role)

object User {
}

角色特征和伴随对象:

sealed trait Role

object Role {
    case object Administrator extends Role
    case object NormalUser extends Role
}

UserRepository 架构配置

import javax.inject.{ Inject, Singleton }
import play.api.db.slick.DatabaseConfigProvider
import slick.jdbc.JdbcProfile

import scala.concurrent.{ Future, ExecutionContext }

@Singleton
class UserRepository @Inject() (dbConfigProvider: DatabaseConfigProvider)(implicit ec: ExecutionContext) {
  private val dbConfig = dbConfigProvider.get[JdbcProfile]
  import dbConfig._
  import profile.api._

  private class UsersTable(tag: Tag) extends Table[User](tag, "users") {
    def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
    def email = column[String]("email")
    def password = column[String]("password")
    def role = column[String]("role")

    def * = (id, email, password, role) <> ((User.apply _).tupled, (User.unapply _))
  }

User.applyUser.unapply 的类型不匹配

[error]  found   : ((Long, String, String, models.Role)) => models.User
[error]  required: ((Long, String, String, String)) => ?
[error]     def * = (id, email, password, role) <> ((User.apply _).tupled, (User.unapply _))

我尝试按照 slick 文档 1 中的建议编写自己的函数类型,并使用 MappedColumnType 创建自定义标量类型 2但似乎都不起作用。

任何帮助将不胜感激!

【问题讨论】:

    标签: scala slick slick-3.0


    【解决方案1】:

    错误在这里:

    def role = column[String]("role")
    

    应该有Role 而不是String

    【讨论】:

    • 不幸的是,这返回:'找不到参数 tt 的隐式值:slick.ast.TypedType[models.Role]` 我尝试在 UserRepository 类中添加它:implicit val roleColumn = MappedColumnType.base[Role, String]( { r =&gt; if (r == Role.Administrator) "Administrator" else "NormalUser" }, { s =&gt; if (s == "Administrator") Role.Administrator else Role.NormalUser } ) 但 sbConfig 转义它定义了范围。
    • @phil 好吧,这是一个不同的问题。如果你想灵活地使用Role,你必须无论如何定义implicit val roleColumn = ... 例如你可以在dbConfig 删除修饰符private。或者让它不那么严格:private[...].
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2019-05-17
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多