0
- oldpid = []
- @res.each do |r|
    - if r[:pid] != oldpid
        - oldpid = r[:pid]
        %tr
            %td= r[:pid]
            %td= r[:bc]
            - else
            %td= r[:bc]

我不知道一张表中有多少列。我得到一个带有“pid”和“bc”的列表,如果“pid”与前一个匹配,我想将它添加到同一行。我试过以各种方式缩进 else 语句,但这是最接近的。这会将两个 'bc' 连续放置,但将第三个放在新行上。有什么想法吗?

4

2 回答 2

1

我假设您的数据如下所示:

@res = [{ pid: 1, bc: 4 }, { pid: 1, bc: 3 }, { pid: 2, bc: 6 }, { pid: 3, bc: 8 }]

你可以把它转换成这样一个更方便的结构......

res_hash = @res.inject({}) { |h, pair| (h[pair[:pid]] ||= []) << pair[:bc]; h }
=> { 1: [4, 3], 2: [6], 3: [8] }

现在您的 HAML(如果我正确理解您的要求)要容易得多:

- res_hash.each |k, v|
  %tr
    %td= k
    - v.each |bc|
      %td= bc

(这会为 :pid 的值输出一个单元格,然后为该键的每个 :bc 值输出一个单元格)

于 2013-10-25T21:09:33.930 回答
0

我和一个group_by. 让我假设您的数据:

@res = [{pid: 2, bc: 'DATA1'},
        {pid: 3, bc: 'DATA2'},
        {pid: 2, bc: 'DATA3'},
        {pid: 4, bc: 'DATA4'},
        {pid: 2, bc: 'DATA5'}]

@res.group_by { |e| e[:pid] }
=> {2 => [{:pid=>2, :bc=>"DATA1"},
          {:pid=>2, :bc=>"DATA3"},
          {:pid=>2, :bc=>"DATA5"}],
    3 => [{:pid=>3, :bc=>"DATA2"}],
    4 => [{:pid=>4, :bc=>"DATA4"}]}

所以...

- @res.group_by { |e| e[:pid] }.each do |pid, elements|
  %tr
    %td= pid
    %td= elements.join # ?

我不确定你想做什么,但你应该离这里只有几步之遥。

于 2013-10-25T20:01:25.077 回答