3

我正在开发一个使用 Slick 1.0 和 cake 模式连接到 postgresql 数据库的项目。
就像现在一样,一切似乎都运行良好,但我还有很多表要添加,并且我意识到所有表都包含许多公共列。我希望能够制作一个包含公共字段的特征,但我无法弄清楚如何让它发挥作用。(我是 scala 的新手,但我认为我的基础知识已经很好了。)

这是一个示例,希望能说明我想要做什么:

一.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 特征不知道 column[T]。我尝试指定一个 self 类型的 Table,但我不知道如何获取 Table 对象,该对象本身位于 scala.slick.driver.BasicTableComponent 特征中。我还尝试指定一个实现列函数的 self 类型,例如:

    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]}
    ...
    }

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

你怎么看?有什么好方法可以完成这项工作吗?

4

1 回答 1

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 _)
      }
    }

它奏效了。

于 2013-03-21T17:35:47.823 回答