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は基本的に私のコンパニオンオブジェクトです。

現在の問題は、オブジェクト定義を次のように書き直すことができないことです。

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

それはタイプではないと言っているので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)

より良い解決策があるかどうか教えてください...

4

1 に答える 1

1

このメソッドを追加するClass/trait RichTable [T](...)extends Table [T](...)を作成してみませんか?

于 2012-11-27T23:30:48.620 に答える