将对象标记为需要一些“自我类型”注释

时间:2013-06-13 21:18:18

标签: scala slick

我在我的Lift scala应用程序中使用Slick框架。此框架要求在所有DDL对象中都存在ExtendedProfile.simple._。目前我把它定义为

trait DatabaseProvider {
  val profile : ExtendedProfile
}


trait PersistUser {
  this : DatabaseProvider => 

  import profile.simple._

  object Users extends Table[(String, String, Boolean)]("user") {
      //  various definitions are here
  }
}

我想要的是将对象用户移到特征之外,所以我可以在表格连接的不同特征中单独使用它。但我不知道如何让Users对象依赖于ScopeProvider在范围内的存在,并导入所有必需的东西。

请建议。

2 个答案:

答案 0 :(得分:1)

你可以这样,虽然我不确定这是你想要做的100%。这里的想法是,您可以首先定义一个通用模式,其中包含不同数据库提供程序之间不同的所有表定义。然后,您可以扩展您希望支持的每个数据库提供程序,设置实际需要的object表定义。这样可以让您灵活地动态指定ExtendedProfile,我认为这是您的目标。我知道这个编译,但我没有尝试运行它。我想我会把它留给你。

import scala.slick.driver.ExtendedProfile
import scala.slick.session.Session

abstract class Schema(val profile:ExtendedProfile){
  import profile.simple._

  abstract class UsersModel extends Table[(String, String, Boolean)]("user") {
    def name = column[String]("name", O.PrimaryKey)
    def email = column[String]("email")
    def valid = column[Boolean]("valid")
    def * = name ~ email ~ valid
  }

  val Users:UsersModel
}

object MySqlSchema extends Schema(scala.slick.driver.MySQLDriver){
  object MySqlUsers extends UsersModel

  val Users:UsersModel = MySqlUsers
}

class UserDAO(schema:Schema)(implicit sess:Session){
  import schema.profile.Implicit._

  def findAllUsers = {
    val q = for(u <- schema.Users) yield u
    q.list
  }
}

答案 1 :(得分:0)

而不是一个对象,将它设为class Users(dbProvider: DatabaseProvider) extends Table ...或者给它与PersistUser相同的自我类型