(提升)在CSS选择器转换期间对项目进行分组?

时间:2013-10-04 04:48:47

标签: scala lift

希望得到一些指导。

请考虑以下代码段:

val q = (for {
    (d, o) <- dx innerJoin ox on (_.user === _.id)
   } yield(d,o))

  "div" #>  q.map { case (x, y) =>
  {
       ".dF1 *" #> x.name &
       ".dF2 *" #> y.id
  }
}

在这个查询中,我有两个表,其中表“ox”是人员列表,“dx”是与这些人相关联的项目列表。 正如它所写,它运作良好,但我最终为一个人拥有的每个项目创建一行。假设有三个用户,前两个有两个项目,最后一个有1个,我有五行:

<div class="dF1">[user1]</div><div class="dF2">[item1]</div>
<div class="dF1">[user1]</div><div class="dF2">[item2]</div>
<div class="dF1">[user2]</div><div class="dF2">[item1]</div>
<div class="dF1">[user2[</div><div class="dF2">[item2]</div>
<div class="dF1">[user3]</div><div class="dF2">[item3]</div>

我想要做的是为每个用户创建一行,并在dF2字段内创建多个div,每个项目一个。然后布局是:

<div class="dF1">[user1]</div><div class="dF2">[item1] [item2]</div>
<div class="dF1">[user2]</div><div class="dF2">[item1] [item2]</div>
<div class="dF1">[user3]</div><div class="dF2">[item1]</div>

我该怎么做?我需要使用中间收藏吗?

1 个答案:

答案 0 :(得分:4)

这里有两个选项,您可以使用数据库返回按字段分组的集合,也可以使用Scala对集合进行分组。如果您使用数据库,则仅限于按x.name等字段进行分组,但您的执行可能会更高效。如果您使用Scala进行分组,则可以按整个对象x进行分组,但最终会进行更多处理和对象创建。您需要确定哪种方法最适合您。

现在,说 - 让我们假设我们正在使用Scala。你会做这样的事情:

"div" #>  q.groupBy(_._1).map { case (x, y) =>
  {
       ".dF1 *" #> x.name &
       ".dF2 *" #> y.map{ case (x2, y2) => y2.id}.mkString(" ") 
  }
}

List不是直接使用查询中包含DO的{​​{1}},而是创建一个类型列表:groupBy。在上面的示例中,我只是将Map[D, List[(D, O)]]的{​​{1}}字段组合成一个字符串,以便输出看起来像您所请求的示例。

您可以让第二张地图返回id而不是单个字符串,以进行进一步的转换。此示例将查找o嵌套在具有类CssSel的{​​{1}}中:

<div class="dF2SubDiv"></div>

如果您希望使用Slick来执行groupBy,您可以在其上找到更多信息herehere