2016-09-14 5 views
0

コレクションを表現し、定型文を減らすために使用できる汎用テーブル抽象クラスを作成しようとしています。滑らかな汎用テーブル

これが私の最初の試みである:

abstract class StringCollectionTable[A](tag: Tag, 
             name1: String, name2: String, 
             table: TableQuery[A], idMapper: A => Rep[Long]) 
extends Table[(Long, String)](tag, name1+"_"+name2) { 

def id = column[Long]("ID_"+name1) 
def item = column[String](name2) 

def pk = primaryKey("pk_"+name1+"_"+name2, (id, item)) 

def idFK = foreignKey(name1 + "_FK", id, table)(idMapper, onUpdate=ForeignKeyAction.Restrict, onDelete=ForeignKeyAction.Cascade) 

override def * : ProvenShape[(Long, String)] = (id, item) 
} 

そして、のように使用することがsuposedさ:だからこれで、私は1 fooで関連するバー-値のコレクションを格納することができ

case class Foo(...) 
class FooTable(tag: Tag) extends Table[Foo](tag, "FOO") {...} 
val foos = TableQuery[FooTable] 
val mapToId = (t: TableQuery[FooTable]) => t.id 


class FooBarTable(tag: Tag) 
extends StringCollectionTable(tag, "FOO", "BAR", foos, mapToId) 

IntellJ IDEAではこのコードは大丈夫です。私はアプリを実行したときしかし、私はエラーを取得する:ラインで

inferred type arguments [slick.lifted.Rep[Long],Nothing,A,Nothing] do not conform to method foreignKey's type parameter bounds [P,PU,TT <: slick.lifted.AbstractTable[_],U] 

def idFK = foreignKey(name1 + "_FK", id, table)(idMapper, onUpdate=ForeignKeyAction.Restrict, onDelete=ForeignKeyAction.Cascade) 

私はいくつかの検索を行ってきたと私は問題を見つけることができません。それは私の最初のスリックプロジェクトで、私は少し失われています。

誰かがこれを行う正しい方法を私に伝えることができますか?

ありがとうございます!

答えて

0

タイプパラメータATableのサブタイプが宣言A <: Table[_]

を意味する必要がありますあなたとこの

abstract class StringCollectionTable[A <: Table[_]](tag: Tag, ...) extends ... { 
    ... 
    override def * = (id, item) 
} 
+0

また "作品" のようなStringCollectionTable [A <:AbstractTable [_]]、私は新しいエラーが表示されます。 一致する形が見つかりません。 Slickは、指定された型のマッピング方法を知らない。 考えられる原因:テーブル[T]のTがあなたの*投影と一致しません。または、クエリでサポートされていないタイプ(スカラリストなど)を使用しています。 必要レベル:slick.lifted.FlatShapeLevel ソースタイプ: アンパックタイプ:U ランチタイプ:任意 –

+0

@AlejandroTrujilloCaballero DEF *に – pamu

+0

が 'defを上書き*として定義され、適切に定義されています:ProvenShape [(ロング、文字列)] =(id、item) 'その行の問題を見ることはできません。 –

関連する問題