2017-09-11 7 views
0

私はScala Anormをプロジェクトに使用しています。私はケースクラスのパーサーを書くのが好きです。次に、これらのパーサーを他のクエリに再利用します。通常はJOINを追加します。Anorm RowParser [A]をRowParser [Option [A]]にするには

時々、オプションの値(の代わりにLEFT JOIN)が必要になることがあります。同じパーサを再利用できるようにすることは非常に便利でしょう。どのようにこれを達成するのか?以下のパーサと

case class Specialty(
    id: Long, 
    name: String 
) 

def parser(table: String): RowParser[Specialty] = { 
    get[Long]("id") ~ get[String](table + ".name") map { 
     case id ~ name => Specialty(id, name) 
    } 
    } 

がどのように私はparser:RowParser[OptionSpecialty]]parser:RowParser[Specialty]を回すことができる。例えば、私は次のような場合のクラスを持っていると言うよう

これは、テーブル専門がLEFT JOINによって追加されたクエリでそれを使用できるようにします。情報の余分な部分として

は、今、私はこのようなパーサを書き換える:

def parserOptional(table: String):RowParser[Option[Specialty]] = { 
    get[Option[Long]]("id") ~ get[Option[String]](table + ".name") map { 
     case oid ~ oname => oid.flatMap{id => 
     oname.map{name => 
      Specialty(id, name) 
     } 
     } 
    } 
    } 

答えて

0

thisに基づいて、私は答え

使用(parser ?)または

def parserOptional(table: String):RowParser[Option[Specialty]] = parser(table) ? 
+1

」を見つけたと思います動作していないようです "と正確には思われません(一方、'。? 'コンビネータはテストの対象です) – cchantep