2015-09-02 5 views
10

Ich suche mehrere Arrays, aber Probleme mit der Ausrichtung in einer Tabelle basierend auf Jahr. In dem Moment, in dem die Daten nicht mit dem entsprechenden Jahr übereinstimmen, wenn Daten in irgendeinem Jahr existieren, werden nur die Daten in der ersten Zeile platziert, dann werden "0" -Daten für den Rest, d. nicht mit dem Jahr übereinstimmen.Looping Multiple Arrays von Jahr

Ansicht

<table> 
<% @a.zip(@b, @c, @d) do |a, b, c, d| %> 
<tr> 
    <td><%= a.year %></td> 
    <% if a.blank? %> 
    <td>0</td> 
    <td>0</td> 
    <% else %> 
    <td><%= a.id %></td> 
    <td><%= a.data %></td> 
    <% end %> 
    <% if b.blank? %> 
    <td>0</td> 
    <td>0</td> 
    <% else %> 
    <td><%= b.id %></td> 
    <td><%= b.data %></td> 
    <% end %> 
    <% if c.blank? %> 
    <td>0</td> 
    <td>0</td> 
    <% else %> 
    <td><%= c.id %></td> 
    <td><%= c.data %></td> 
    <% end %> 
    <% if d.blank? %> 
    <td>0</td> 
    <td>0</td> 
    <% else %> 
    <td><%= d.id %></td> 
    <td><%= d.data %></td> 
    <% end %> 
</tr> 
</table> 

-Controller

@a = Result.where(id: params[:id_select]).group('year').where('data > 0').select('AVG(data) AS data, year as year, COUNT(id) AS id').order('year ASC') 

@b = Result.where(id: params[:id_select]).group('year').where('data > 0').select('AVG(data) AS data, year as year, COUNT(id) AS id').where('id = ?', '0').order('year ASC') 

@c = Result.where(id: params[:id_select]).group('year').where('data > 0').select('AVG(data) AS data, year as year, COUNT(id) AS id').where('id = ?', '1').order('year ASC') 

@d = Result.where(id: params[:id_select]).group('year').where('data > 0').select('AVG(data) AS data, year as year, COUNT(id) AS id').where('id = ?', '2').order('year ASC') 
+0

Bitte Datenformat in der Tabelle und Ausgabeformat erwähnen Sie wollen. – seahawk

+0

Ich habe einige Probleme bekommen, was die Frage will, können Sie schreiben Sie die Daten, die Sie explizit haben ** nicht die Abfragen ** und das Format, das Sie im Text wollen. –

+0

@DollarChills, Ich habe eine Lösung für Ihr Problem unten vorgeschlagen. Ich hoffe, ich verstehe es richtig. Lassen Sie es mich wissen, wenn es Ihren Bedürfnissen entspricht. – dimakura

Antwort

4

Ich denke, Sie auf diese Weise versuchen. In diesem müssen Sie nicht nach leeren Werten suchen. Ich hoffe, @a enthält alle verfügbaren Jahre sonst braucht man alle Jahre eine Schleife über Jahre

<table> 
<% @a.each do |a| %> 
<tr> 
    <td><%= a.year %></td> 
    <td><%= (a.id || 0 rescue 0) %></td> 
    <td><%= (a.data || 0 rescue 0) %></td> 
    <td><%= (@b.select{|h| h if h["year"] == a.year }.first.id || 0 rescue 0) %></td> 
    <td><%= (@b.select{|h| h if h["year"] == a.year }.first.data || 0 rescue 0) %></td> 
    <td><%= (@c.select{|h| h if h["year"] == a.year }.first.id || 0 rescue 0) %></td> 
    <td><%= (@c.select{|h| h if h["year"] == a.year }.first.data || 0 rescue 0) %></td> 
    <td><%= (@d.select{|h| h if h["year"] == a.year }.first.id || 0 rescue 0) %></td> 
    <td><%= (@d.select{|h| h if h["year"] == a.year }.first.data || 0 rescue 0) %></td> 
</tr> 
<% end %> 
</table> 

zu fusionieren Wenn Ihr @a nicht alle Jahre enthält dann nur versuchen, es zu fusionieren von

years = ((@a.collect{|h| h["year"]}) + (@b.collect{|h| h["year"]}) + (@c.collect{|h| h["year"]}) + (@d.collect{|h| h["year"]})).uniq 

dann Sie können über Jahre Array nur Looping als:

<% years.each do |year| %> 
    <tr> 
     <td><%= year %></td> 
     <td><%= (@a.select{|h| h if h["year"] == year }.first.id || 0 rescue 0) %></td> 
     <td><%= (@a.select{|h| h if h["year"] == year }.first.data || 0 rescue 0) %></td> 
     <td><%= (@b.select{|h| h if h["year"] == year }.first.id || 0 rescue 0) %></td> 
     <td><%= (@b.select{|h| h if h["year"] == year }.first.data || 0 rescue 0) %></td> 
     <td><%= (@c.select{|h| h if h["year"] == year }.first.id || 0 rescue 0) %></td> 
     <td><%= (@c.select{|h| h if h["year"] == year }.first.data || 0 rescue 0) %></td> 
     <td><%= (@d.select{|h| h if h["year"] == year }.first.id || 0 rescue 0) %></td> 
     <td><%= (@d.select{|h| h if h["year"] == year }.first.data || 0 rescue 0) %></td> 
    </tr> 
    <% end %> 
    </table> 
1

Sie wahrscheinlich das bedeutet in der Ansicht:

<% 
    A = @a.group_by{|a| a.year} 
    B = @b.group_by{|b| b.year} 
    C = @c.group_by{|c| c.year} 
    D = @d.group_by{|d| d.year} 
%> 

<table> 
    <% A.each do |year, a| %> 
    <% b = B[year] %> 
    <% c = C[year] %> 
    <% d = D[year] %> 
    <tr> 
     <td><%= year %></td> 
     <% if a.blank? %> 
     <td>0</td> 
     <td>0</td> 
     <% else %> 
     <%= a.id %> 
     <%= a.data %> 
     <% end %> 
     <% if b.blank? %> 
     <td>0</td> 
     <td>0</td> 
     <% else %> 
     <td><%= b.id %></td> 
     <td><%= b.data %></td> 
     <% end %> 
     <% if c.blank? %> 
     <td>0</td> 
     <td>0</td> 
     <% else %> 
     <td><%= c.id %></td> 
     <td><%= c.data %></td> 
     <% end %> 
     <% if d.blank? %> 
     <td>0</td> 
     <td>0</td> 
     <% else %> 
     <td><%= d.id %></td> 
     <td><%= d.data %></td> 
     <% end %> 
    </tr> 
    <% end %> 
</table> 

Ich nehme hier @a enthält alle Jahre andere Arrays enthalten können (basierend auf Abfrage). Wenn es nicht der Fall ist, dann müssen Sie zunächst vollständige Palette von Jahren schaffen:

<% years = (A.keys + B.keys + C.keys + D.keys).uniq %> 
<table> 
    <% years.each do |year| %> 
    <% a = A[year] %> 
    <!-- the rest is the same, as above --> 
    <% end %> 
</table> 
+0

Danke Dimakura, ich habe diese Methode versucht und kein Glück. Ich gruppiere schon nach Jahren im Controller. – DollarChills

+0

Ich bekomme undefinierte Methode 'id ', wo' b.id 'startet. – DollarChills

+0

@DollarChills können Sie mir zeigen, was ist oder wie Sie diese Arrays bekommen – dimakura

1

In der Steuerung:

@results_by_year = Result.where(your_conditions).group_by(&:year) 
# this retrieves all the Result records wanted, without taking care of the record's `year` 

Die Struktur des Hash wird so aussehen:

# { 2010: [<Result id:1>, <Result id:3>], 
# 2012: [<Result id:2>], 
# 2014: [<Result id:7>, <Result id:9>] } 

Nach Ansicht:

@results_by_year.each do |year, results| 
    = year 
    - results.each do |result| 
    = result.id 
    = result.data 
end