2012-04-26 58 views
2

我在我的Rails下面的代码3应用:在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> 

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

回答

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

+0

这看起来方式比任何到目前为止,我已经试过更优雅。有一件事,测试实际上被称为TestDone。我已经尝试了所有的工作,但它不会加载该值。任何提示? – dannymcc 2012-04-26 17:42:52

+0

@dannymcc Group_by只会对完全相同的事物进行分组,您的TestDone可能会为每个实验室包含不同的小时,分​​钟和秒钟。我编辑了我的答案,使用group_by的完整块语法在分组操作之前预处理TestDone。 – Unixmonkey 2012-04-26 17:53:22

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 %> 

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

我认为这就是你要找的。

相关问题