Play フレームワーク テンプレートに渡されたリストの反復処理に問題があります。基本的に、多対多の関連付けから取得するクエリがあり、親キーを 1 回レンダリングし、関連付けられたキーを数回レンダリングしたいと考えています。
以下は、私が使用している実際のコードです。
Slick、Scala、Play 2.0 を使用して、次のテーブル スキーマを作成しました。
object Recipes extends Table[(Long, String, String)]("RECIPES") {
def id = column[Long]("REC_ID", O.PrimaryKey, O.AutoInc)
def cuisine = column[String]("CUISINE")
def instructions = column[String]("INSTRUCTIONS")
def * = id ~ cuisine ~ instructions
}
object Ingredients extends Table[(Long, String, String)]("INGREDIENTS") {
def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
def brand = column[String]("BRAND")
def name = column[String]("NAME")
def * = id ~ brand ~ name
}
object RecipeIngredient extends Table[(Long, Long, Long, Int, String)]("REC_ING") {
def id = column[Long]("ID", O.PrimaryKey, O.AutoInc)
def recID = column[Long]("REC_ID")
def ingID = column[Long]("ING_ID")
def quantity = column[Int]("QUANTITY")
def units = column[String]("UNITS")
def * = id ~ recID ~ ingID ~ quantity ~ units
def recipe = foreignKey("REC_FK", recID, Recipes)(_.id)
def ingredient = foreignKey("ING_FK", ingID, Ingredients)(_.id)
}
Slick を使用して、コントローラー内で次のクエリを生成q.list
し、ビューに渡します。アイデアは、ID 1 とそれに関連するすべての成分を含むレシピを渡してレンダリングすることです。
val recID = 1.longValue() // Just a test to get the Recipe with ID === 1
val q = for {
r <- Recipes if r.id === recID
ri <- RecipeIngredient if ri.recID === recID
i <-Ingredients if i.id === ri.ingID
} yield (r.id, r.cuisine, r.instructions, ri.quantity, ri.units, i.brand, i.name)
私の見解は次のとおりです。
@(message: String, result: List[(Long, String, String, Int, String, String, String)])
@main("Site name") {
@for((id, cuisine,instructions, quantity, units, brand, name) <- result) {
<h2>--Recipe--</h2>
RecID: @id <br>
Cuisine: @cuisine <br>
Instructions: @instructions <br>
<h2>--Ingredients--</h2>
Ingredient: @quantity @units of @brand @name<br>
}
}
これはすべて問題ありませんが、次のような出力が得られます。
--Recipe--
RecID: 1
Cuisine: Chinese
Instructions: Instructions here..
--Ingredients--
Ingredient: 3 cloves of Generic Ginger
--Recipe--
RecID: 1
Cuisine: Chinese
Instructions: Instructions here..
--Ingredients--
Ingredient: 3 slices of Generic Cucumber
ご覧のとおり、レシピ自体は 2 回繰り返されます。私が最終的に望むのは、一度印刷されたレシピと、その後に関連する材料のリストが繰り返されて表示されることです (複数の材料がある場合があります)。
これを達成する方法についてのアイデアはありますか?