2017-12-22 25 views
0

play-slickを使用して列挙型の列を更新する方法を理解できません。play slick update列挙型列

object TestQueries extends TableQuery[Tests](new Tests(_)) { 
    def updateStatus(id: String, newStatus: TestStatus) = { 
    TestQueries.filter(_.id === id).map(_.status).update(newStatus) 
    } 
} 

[error] Slick does not know how to map the given types. 
[error] Possible causes: T in Table[T] does not match your * projection, 
[error] you use an unsupported type in a Query (e.g. scala List), 
[error] or you forgot to import a driver api into scope. 
[error] Required level: slick.lifted.FlatShapeLevel 
[error]  Source type: slick.lifted.Rep[models.TestStatus.Value] 
[error] Unpacked type: T 
[error]  Packed type: G 
[error]  TestQueries.filter(_.id === id).map(_.status).update(newStatus) 
[error]          ^

class Tests(tag: Tag) extends Table[Test](tag, "tests") { 
    implicit val statusColumn = MappedColumnType.base[TestStatus, String](_.toString, TestStatus.withName) 
    override def * = (id, status) <> ((Test.apply _).tupled, Test.unapply) 
    val id = column[String]("id", 0.PrimaryKey) 
    val status = column[TestStatus]("status") 
} 

私が行くとテストの行を更新しようと、私はエラーを取得:

object TestStatus extends Enumeration { 
    type TestStatus = Value 
    val Status1 = Value("Status1") 
} 
case class Test (
    id: String, 
    status: TestStatus 
) 

とテーブルマッピング:

は、ここに私の列挙型とケースクラスです

IntelliJはTestQueries.filter(_.id === id).map(_.status)のタイプがQuery[Nothing, Nothing, Seq]であることを示していますsを更新関数ではなく特定の列で更新​​します。

IDを更新すると、同じ構造を使用して問題なく動作します。

+0

で見ることができ、列マッピングのさらに読み取りのために

のみ 'Tests'クラスはTestStatus''のための暗黙の列マッピングを持っているように思えます。 'TestQueries'のスコープ内に適切な列マッピングがあるかどうかを明確にすることができますか?実験のために、 'TestQueries'の中で' statusColumn'の値を複製し、それがコンパイルされているかどうか確認してください。 – AdamBat

+0

@AdamBat私のコードからは少しはっきりしていませんが、さまざまなスコープに列マッピングをコピーしようとしました: 'TestStatus'オブジェクトレベルと' TestQueries'レベル、すべてが同じ結果です。 – itadoatL

+0

複製された問題をリポジトリに提供できますか?私はあなたのコードをアドホックにコピーし、同じコンパイラエラーが発生しました。私が提案したように、 'TestQueries'に' TestStatus'カラムマッピングを複製することは、上記のコメントで問題の解決に役立ちました。ここに私が何をしたかを示す私の要点があります:https://gist.github.com/Dasiu/ae4fa9bfa9077569e5e07a02aa1493f0 – AdamBat

答えて

0

TestStatus.Valueのカスタム列タイプを定義する必要があります。これは、すでにサポートされているタイプにマッピングすることにより、カスタム列の型を構築することができますどのように滑らかなである:

implicit def testStatCT: BaseTypedType[TestStatus.Value] = 
    MappedColumnType.base[TestStatus.Value, String](
    enum => enum.toString, str => TestStatus.withName(str) 
) 

あなたの例では、1つのように暗黙の解像度は失敗(またはより良いまだ定義されてどこにインポートするには、この暗黙のニーズオブジェクトでは常に利用できるようになります)この方法では、TestStatus.ValueBaseTypedTypeであるという証拠を得ることができます。これは、基本的に何かがサポートされている列型であることを意味します。あなたはSlick Documentation