Scala Play Framework 2.1 Slick 1.0 Cake Pattern Common Table Fields

时间:2013-03-20 22:32:07

标签: scala slick

我正在开发一个使用Slick 1.0和蛋糕模式连接到postgresql数据库的项目 就像现在一样,一切似乎都运行良好,但我有更多的表要添加,我意识到所有表都包含许多常见的列。我希望能够创建一个包含常见字段的特征,但我无法弄清楚如何使其工作。 (我在scala上相当新,但我认为我的基础知识非常好。)

这是一个有希望说明我想做的事情的例子:

One.scala:

    package models.db.slick
    import java.util.UUID
    import play.api.db.slick.Profile
    case class One(common1:UUID, common2:String, unique1:String)
    trait OneComponent{this: Profile =>
      import profile.simple._
      object Ones extends Table[One]("One") with CommonColumns{
        def unique1 = column[String]("unique1")
        def * = common1 ~ common2 ~ unique1 <> (One.apply _, One.unapply _)
      }
    }

ColumnColumns.scala:

    package models.db.slick
    import java.util.UUID
    import play.api.db.slick.Profile
    trait CommonColumns{
      def common1 = column[UUID]("common1")
      def common2 = column[String]("common2")
    }

这不能编译,因为ColumnColumns特征不知道列[T]。我尝试指定一个自我类型的表,但我无法弄清楚如何到达它本身在scala.slick.driver.BasicTableComponent特性中的Table对象。我还试图指定一个实现列函数的自我类型,如:

    trait CommonColumns{ this => {def column[C](n: String, options:    
                                   scala.slick.lifted.ColumnOption[C]* )
                                   (implicit tm:scala.slick.lifted.TypeMapper[C]
                                    ): scala.slick.lifted.Column[C]}
    ...
    }

但这不起作用。我很可能在那个语法上有错误的语法,但我找不到如何做到这一点的好例子。

你怎么看?有没有一个很好的方法来完成这个?

1 个答案:

答案 0 :(得分:3)

我明白了! 至少我想我做到了。如果有人注意到这个问题,请告诉我。

好的,我的表现就是这样:

我将CommonColumns特性更改为:

    trait CommonColumnsComponent{ this:Profile =>
      import profile.simple._
      trait CommonColumns{ this:Table[_] =>
        def common1 = column[UUID]("common1")
        def common2 = column[String]("common2")
      }
    }

然后我将OneComponent更改为:

    trait OneComponent extends CommonColumnsComponent{this: Profile =>
      import profile.simple._
      object Ones extends Table[One]("One") with CommonColumns{
        def unique1 = column[String]("unique1")
        def * = common1 ~ common2 ~ unique1 <> (One.apply _, One.unapply _)
      }
    }

并且有效。