HAML Ruby - 使用键值对的未知#列制作表

时间:2013-10-25 19:38:41

标签: ruby haml

- 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'连成一排,但把第三个放在一个新的一行上。有什么想法吗?

2 个答案:

答案 0 :(得分: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值)

答案 1 :(得分: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 # ?

我不确定你想做什么,但你应该只是在这里几个黑客。