2

Rails3アプリケーションに次のコードがあります。

ビューを表示(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 に答える