3

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 トレイトは column[T] を認識しないため、これはコンパイルされません。Table の self 型を指定しようとしましたが、それ自体が 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]}
    ...
    }

しかし、それはうまくいきません。おそらく構文が間違っている可能性がありますが、これを行う方法の良い例が見つかりません。

どう思いますか?これを行う良い方法はありますか?

4

1 に答える 1

3

私はそれを考え出した!少なくとも私はそうだったと思います。誰かがこれに何か問題があることに気づいたら、私に知らせてください。

OK、これが私がやった方法です:

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 に答える