6

computer-database サンプルを調べたところ、Computer パーサーを再利用するために、list メソッドが Computer.withCompany パーサーを使用し、(Computer, Company) のタプルを返すことがわかりました。

私が処理しなければならない場合、コンピューターのIDへの参照の代わりに、このようにコンピューターオブジェクトが必要です

case class Computer(id: Pk[Long] = NotAssigned, name: String, 導入: Option[Date], 廃止: Option[Date], company: Company)

だから私は次のようなものをどのように達成できるかを考えていました(もちろんseudocodeです)

val simple = {
  get[Pk[Long]]("computer.id") ~
  get[String]("computer.name") ~
  get[Option[Date]]("computer.introduced") ~
  get[Option[Date]]("computer.discontinued") ~
  get[Company]("company.*") map {
    case id~name~introduced~discontinued~company => Computer(id, name, introduced, discontinued, company)
  }
}

明らかに、難しい部分は getCompany を解決する方法です。

何か案が???

4

1 に答える 1

5

Idea エンティティと IdeaType エンティティがあります (コンピューター データベースの例では、コンピューターと会社のようなものです)。

case class IdeaTest(
  val id: Pk[Long]          = NotAssigned,
  val name: String          = "unknown idea",
  val description: String   = "no description",
  val kind: IdeaType        = IdeaType()
)

case class IdeaType (
  val id: Pk[Long] = NotAssigned,
  val name: String = "unknown idea type",
  val description: String = "no description"
)

TypeParser を定義します

val typeParser: RowParser[IdeaType] = {
  get[Pk[Long]]("idea_type.id") ~
  get[String]("idea_type.name") ~
  get[String]("idea_type.description") map {
    case id~name~description => IdeaType(
      id, name, description
    )
  }
}

そして、私が最初に試したことは次のとおりです。

val ideaParser: RowParser[IdeaTest] = {
  get[Pk[Long]]("idea.id") ~
  get[String]("idea.name") ~
  get[String]("idea.description") ~
  typeParser map {
    case id~name~description~ideaType => IdeaTest(
      id, name, description, ideaType
    )
  }
}

コンパイルに問題はありませんが、常に ideaType の読み込みに問題があります。

最終的に、ideaType を指定せずに ideaParser を定義し、それを typeParser で構成する必要がありました。

val typeParser: RowParser[IdeaType] = {
  get[Pk[Long]]("idea_type.id") ~
  get[String]("idea_type.name") ~
  get[String]("idea_type.description") map {
    case id~name~description => IdeaType(
      id, name, description
    )
  }
}

val ideaWithTypeParser = ideaParser ~ typeParser map {
  case idea~kind => (idea.copy(kind=kind))
}

これを使用したコードは次のとおりです。

def ideaById(id: Long): Option[IdeaTest] = {
  DB.withConnection { implicit connection =>
    SQL("""
      select * from
      idea inner join idea_type 
      on idea.idea_type_id = idea_type.id 
      where idea.id = {id}""").
      on('id -> id).
      as(ideaParser.singleOpt)
  }
}

唯一の問題は、一貫性のない状態 (ideaType なし) で IdeaTest オブジェクトを作成し、それを正しい IdeaType を持つ別のインスタンスにコピーする必要があることです。

于 2012-10-02T07:03:15.057 に答える