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 を持つ別のインスタンスにコピーする必要があることです。