私はこのようなコンパニオンオブジェクトを持っています:
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)
より良い解決策があるかどうか教えてください...