2012-11-27 126 views
2

我有一個同伴對象是這樣的:斯卡拉泛型發出

object Addresses extends Table[Address]("address"){ 
    //some mapping columns 
    .... 

    //a method I want to made generic 
    def findAll(limit: Option[Int], offset: Option[Int]): Seq[Address] = DBTest.db.withSession { implicit db: Session => 
    (limit, offset) match { 
     case (Some(l), Some(o)) => Addresses.map { a => a }.drop(o).take(l).list 
     case (None, None) => Addresses.map { a => a }.drop(ConfigurationsLoader.DefaultOffset).take(ConfigurationsLoader.DefaultLimit).list 
     case (Some(l), None) => Addresses.map { a => a }.take(l).list 
     case (None, Some(o)) => Addresses.map { a => a }.drop(o).list 
    } 
    } 
案例類 Address

因爲我有很多這樣的對象(每個定義表)我想移動findAll方法的特點使它通用的,我試圖做這樣的:

trait DbGenericOperations[T, U <: Table[T]]{ 
    val entities: U 
    /** 
    * Based on REST conventions, for listing it's good to use limit and offset, like: /entities?limit=25&offset=50. 
    */ 
    def findAll(limit: Option[Int], offset: Option[Int]): Seq[T] = DBTest.db.withSession { implicit db: Session => 
    (limit, offset) match { 
     case (Some(l), Some(o)) => entities.map { a => a }.drop(o).take(l).list 
     case (None, None) => entities.map { a => a }.drop(ConfigurationsLoader.DefaultOffset).take(ConfigurationsLoader.DefaultLimit).list 
     case (Some(l), None) => entities.map { a => a }.take(l).list 
     case (None, Some(o)) => entities.map { a => a }.drop(o).list 
    } 
    } 
} 

你可能注意到了,entities是基本上是我的同伴對象。

現在的問題是,我不能重寫這樣我的對象定義:因爲它說,Addresses不是一個類型

object Addresses extends Table[Address]("address") with DbGenericOperations[Address, Addresses]{

...

我很新的Scala和我想知道:有什麼辦法可以解決這個問題嗎?

更新:我已經做了這樣的:

trait DbGenericOperations[T]{ 
     /** 
     * Based on REST conventions, for listing it's good to use limit and offset, like: /entities?limit=25&offset=50. 
     */ 
     def findAll(limit: Option[Int], offset: Option[Int], entities: Table[T]): Seq[T] = DBTest.db.withSession { implicit db: Session => 
     (limit, offset) match { 
      case (Some(l), Some(o)) => entities.map { a => a }.drop(o).take(l).list 
      case (None, None) => entities.map { a => a }.drop(ConfigurationsLoader.DefaultOffset).take(ConfigurationsLoader.DefaultLimit).list 
      case (Some(l), None) => entities.map { a => a }.take(l).list 
      case (None, Some(o)) => entities.map { a => a }.drop(o).list 
     } 
     } 
    } 

,並宣佈同伴對象是這樣的: object Addresses extends Table[Address]("address") with DbGenericOperations[Address]

,但我不喜歡使用這種方法:

val results = Addresses.findAll(limit, offset, Addresses)

請讓我知道是否有一個tter溶液...

回答

1

爲什麼不創建類/性狀RichTable [T](...)延伸表[T](...),這將增加該方法?

+0

因爲當我必須擴展表[T]時,我還必須指定表名:'extends Table [Address](「address」)'所以我不再處於一般情況下... –

+0

不明白。出了什麼問題: 抽象類RichTable [T](名稱:字符串)擴展表格[t](名稱){ ... } – Jakozaur

+0

對,這確實很酷,工作不錯:) –