如何使用循环从数据查询创建多个表

时间:2015-03-22 01:26:45

标签: ruby-on-rails ruby ruby-on-rails-4

我将帖子拆分成这样的字母组。

A

C

电子

每封信需要1张表。

每行有2列标题和标签。

如何正确地将表添加到循环中,以便每个字母都有1个表?

<table style=" width:100%; table-layout:fixed " > 

</table>


index.html.erb

<% cur_letter = nil %>

<% @posts.each do |t| %>

      <% title_letter = t.title[0].capitalize.match(/[A-Z]/) ? t.title[0].capitalize : "#" %> 


      <% if title_letter != cur_letter %>
        <% cur_letter = title_letter %>
        <%= cur_letter %>
      <% end %>


      <tr>
        <td style="width:50%"><%= t.title %></td>

        <td style="width:50%"><%= t.tags %></td>
      </tr>

<% end %>

2 个答案:

答案 0 :(得分:0)

我假设您的帖子已按字母顺序排序。你想要:

  1. 打开第一张表。
  2. 每次点击新信时,请关闭现有表并打开一个新表。
  3. 最后,关闭最后一张桌子。
  4. 代码看起来像这样:

    <% cur_letter = nil %>
    <table style=" width:100%; table-layout:fixed " > 
    <% @posts.each do |t| %>
    
          <% title_letter = t.title[0].capitalize.match(/[A-Z]/) ? t.title[0].capitalize : "#" %> 
    
    
          <% if title_letter != cur_letter %>
            <% cur_letter = title_letter %>
            <%= cur_letter %>
            <!-- You're switching letters here, so close the current table and start a new one. -->
            </table>
            <table style=" width:100%; table-layout:fixed " > 
          <% end %>
    
    
          <tr>
            <td style="width:50%"><%= t.title %></td>
    
            <td style="width:50%"><%= t.tags %></td>
          </tr>
    
    <% end %>
    </table>
    

答案 1 :(得分:0)

编辑:我将@post更改为@posts,风格合适

您可以在将数据传递到视图之前将数据组合在一起,而不是在视图中进行大量体操:

@posts = Post.all.group_by {|post| post.title.downcase[0]}

# => {"a" => [<post....#array of post beginning with "A"], "b" => [post... #and so on... ]}

这将创建一个散列,其中一个键表示每个第一个字母,其值为所有Post对象,其标题以该字母开头。现在,传递给视图后,您可以通过几种方式迭代它们。

为了以后找到这个并且碰到他们正在分组的字段在某个地方具有空值的非常真实的可能性,我将添加它以涵盖包括零值的所有情况:

@posts = Post.all.group_by do |post|
 if post.title == nil  
   post.title = ' '    
 end    
 post.title.downcase[0]  

结束

现在进入视图......

如果您只想要存在的字母,即如果您没有任何以“X”开头的帖子,那么您可以遍历这些键

<% @posts.keys.sort.each do |key| %>  #this is where the sorting a-z happens

    <h2><%= key.upcase %></h2><br>

    <table style=" width:100%; table-layout:fixed " > 

       <% @posts[key].each do |post| %>
          <tr>  
              <td> <%= post.title %> </td>
              <td> <%= post.tags  %> </td>
          </tr>
       <% end %>

    </table>

<% end %>

我遗漏了你桌子的造型细节,因为这取决于你。

如果您希望列出每一封信,即使没有以该信件开头的帖子标题,您也可以这样做:

 <% (('0'..'9').to_a + ('a'..'z').to_a).each do |letter| %>
    #this generates ['0','1','2'....'z']
    <h2><%= letter.upcase %></h2><br>

    <table style=" width:100%; table-layout:fixed " > 

       <% @posts[letter].each do |post| %>
          <tr>  
              <td> <%= post.title %> </td>
              <td> <%= post.tags  %> </td>
          </tr>
       <% end %>

    </table>

<% end %>

这会给你:

<强> A

以“a”开头的帖子一些标签

另一篇以“a”开头的帖子一些标签

<强>乙

<强> C

<强> d

决定以“d”开头一些标签

Dis post以“d”开头;-) |一些标签

<强>电子

等...

此样式的问题在于,如果您有任何以非字母/非数字字符开头的帖子,除非在外部循环数组中包含所有这些字符,否则您将看不到它们。这就是为什么我会以第一种方式做到这一点,因为它代表了存在的数据而不是猜测可能存在哪些数据。