2012-04-26 12 views
2

私は3アプリケーションの私のRailsで次のコードがあります(animal.rbと呼ばれる別のモデルから)Rails 3のビュー内のレコードをグループ化しますか?

を表示するビュー

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

+0

@dannymcc Group_byはまったく同じものだけをグループ化するため、TestDoneにはおそらく各ラボごとに異なる時間、分、秒が含まれています。グループ化操作の前にTestDoneを前処理するために、group_byの完全ブロック構文を使用する答えを編集しました。 – Unixmonkey

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

は、最もきれいな解決策が、それはあなたのコードに基づいています。 基本的に、最後の要素の日付を実際の要素の日付と比較するために格納する必要があります。それらが異なる場合は、新しい日付を表示する必要があります。彼らは日付順に並べ替えられているので、同じ日付の要素は互いに近くにあります。

あなたが探していたものだと思います。

関連する問題