2

我的 Rails 3 应用程序中有以下代码:

显示视图(来自另一个名为 animal.rb 的模型)

 <% @animal.labs.each do |lab| %>
    <li>
      <%= lab.TestDone.strftime("%d %b. %Y") %> 
      <h5><%= lab.TestType %></h5>
      <h6><%= lab.TestLower %></h6> 
      <b><%= lab.TestResult %></b> 
      <h6><%= lab.TestUpper %></h6>
    </li>
<% end %>

实验室模型

belongs_to :animal
default_scope :order => "TestDone DESC", :group => "TestDone"

上面的代码成功地将所有结果按日期分组。但是,它只显示日期之后每个值的第一个。

例如,如果输出最初(分组之前)是这样的:

<li>
 26 April 2012
 <h5>Glucose</h5>
 <h6>1.0</h6>
 <b>1.8</b>
 <h6>2.0</h6>
</li>

<li>
 26 April 2012
 <h5>WBC</h5>
 <h6>1.1</h6>
 <b>2.8</b>
 <h6>3.0</h6>
</li>

<li>
 26 April 2012
 <h5>ABC</h5>
 <h6>1.0</h6>
 <b>1.6</b>
 <h6>2.0</h6>
</li>

那么它会在分组后输出以下内容:

<li>
 26 April 2012
 <h5>Glucose</h5>
 <h6>1.0</h6>
 <b>1.8</b>
 <h6>2.0</h6>
</li>

产生这样的东西的正确方法是什么:

<li>26 April 2012</li>
<li>
  <h5>Glucose</h5>
  <h6>1.0</h6>
  <b>1.8</b>
  <h6>2.0</h6>
</li>
<li>
 <h5>WBC</h5>
 <h6>1.1</h6>
 <b>2.8</b>
 <h6>3.0</h6>
</li>
<li>
 <h5>ABC</h5>
 <h6>1.0</h6>
 <b>1.6</b>
 <h6>2.0</h6>
</li>

所以我有一个日期标题,然后下面列出了该日期的每条记录?

4

2 回答 2

3

一种更简单的方法是group_by像这样使用:

 <% @animal.labs.group_by{|l| l.TestDone.strftime("%d %b. %Y") }.each do |testdate,labs| %>
   <li><%= testdate %></li>
   <% labs.each do |lab| %>
     <li>
       <h5><%= lab.TestType %></h5>
       <h6><%= lab.TestLower %></h6> 
       <b><%= lab.TestResult %></b> 
       <h6><%= lab.TestUpper %></h6>
     </li>
   <% end %>
 <% end %>

http://api.rubyonrails.org/classes/Enumerable.html#method-i-group_by

于 2012-04-26T16:44:48.770 回答
1

分组不会按照您想要的方式工作。首先,您不应该将它分组到您的 default_scope 中,但您可以在视图或控制器中使用一些聚合。

模型:

default_scope :order => "TestDone DESC"

看法:

<% prev = nil %>
<% @animal.labs.each do |lab| %>
    <%= "</ul></li>" if prev != nil && prev != lab.TestDone %>
    <%= "<li>"+lab.TestDone.strftime("%d %b. %Y")+"<ul>" if prev != lab.TestDone %>
      <li>
        <h5><%= lab.TestType %></h5>
        <h6><%= lab.TestLower %></h6> 
        <b><%= lab.TestResult %></b> 
        <h6><%= lab.TestUpper %></h6>
      </li>
    <% prev = lab.TestDone %>
<% end %>
<%= "</ul></li>" if prev != nil %>

不是最漂亮的解决方案,但它基于您的代码。基本上,您需要存储最后一个元素的日期,以便将其与实际元素的日期进行比较。如果它们不同,则必须显示新日期。因为它们按日期排序,所以具有相同日期的元素彼此接近。

我想这就是你要找的。

于 2012-04-26T12:48:00.647 回答