2016-08-24 18 views
1

私のコードで繰り返しパターンを見つけていますが、私はそれを抽象化したいと思います。コンパイラは次のエラーで文句を言うしかしSlickを使用してScalaの述語でクエリを抽象化する方法

def queryByPredicate[A, B](p: (A => Rep[Boolean]), t: TableQuery[A]): Future[Option[B]] = { 
    val query = t.filter(p) 
    db.run(query.result.headOption) 
} 

Error:(132, 25) type mismatch; 
found : slick.profile.SqlAction[Option[A#TableElementType],slick.dbio.NoStream,slick.dbio.Effect.Read] 
required: slick.dbio.DBIOAction[Option[B],slick.dbio.NoStream,Nothing] 
db.run(query.result.headOption) 

そして、私はこのような何かを試してみました

def queryByPredicate(p: (OAuthClientTable => Rep[Boolean])): Future[Option[OAuthClient]] = { 
    val query = oAuthClientTableQuery.filter(p) 
    db.run(query.result.headOption) 
} 

:私は抽象的に希望のコードは次のようなものです正直なところ、ジェネリックの作成方法はわかりません。Option[A#TableElementType]

答えて

1
def queryByPredicate[A <: Table[B], B](p: (A => Rep[Boolean]), t: TableQuery[A]): Future[Option[B]] = { 
    val query = t.filter(p) 
    db.run(query.result.headOption) 
} 
+0

こんにちは、これは興味深いです。私は抽象化も好きです。あなたはこのショーでもっとコードを詳しく説明できますか?私はこれを今まとめようとしていますが、私のタイプはまだまだ合っていません。ありがとう。 – dasnervtdoch

関連する問題