按年循环多个数组
Looping Multiple Arrays by year
我正在查看多个数组,但无法根据年份在 table 中对齐它们。目前数据与相应年份不一致,如果数据存在于任何年份,它只是将数据放在第一行,然后将其余数据放置为“0”数据,即。与年份不符。
查看
<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>
控制器
@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')
在您看来,您可能是这个意思:
<%
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>
我假设这里 @a
包含其他数组可能包含的所有年份(基于查询)。如果不是这样,那么您首先需要创建完整的年份数组:
<% 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>
我觉得你可以试试这个方法。在此您无需检查空白值。我希望@a 包含你所有可用的年份,否则你需要将所有年份合并为一个循环,通过 years
<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>
如果您的@a 不包含所有年份,那么只需尝试通过
合并它
years = ((@a.collect{|h| h["year"]}) + (@b.collect{|h| h["year"]}) + (@c.collect{|h| h["year"]}) + (@d.collect{|h| h["year"]})).uniq
然后你可以循环遍历年数组:
<% 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>
在控制器中:
@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`
散列的结构如下:
# { 2010: [<Result id:1>, <Result id:3>],
# 2012: [<Result id:2>],
# 2014: [<Result id:7>, <Result id:9>] }
在视图中:
@results_by_year.each do |year, results|
= year
- results.each do |result|
= result.id
= result.data
end
我正在查看多个数组,但无法根据年份在 table 中对齐它们。目前数据与相应年份不一致,如果数据存在于任何年份,它只是将数据放在第一行,然后将其余数据放置为“0”数据,即。与年份不符。
查看
<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>
控制器
@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')
在您看来,您可能是这个意思:
<%
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>
我假设这里 @a
包含其他数组可能包含的所有年份(基于查询)。如果不是这样,那么您首先需要创建完整的年份数组:
<% 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>
我觉得你可以试试这个方法。在此您无需检查空白值。我希望@a 包含你所有可用的年份,否则你需要将所有年份合并为一个循环,通过 years
<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>
如果您的@a 不包含所有年份,那么只需尝试通过
合并它years = ((@a.collect{|h| h["year"]}) + (@b.collect{|h| h["year"]}) + (@c.collect{|h| h["year"]}) + (@d.collect{|h| h["year"]})).uniq
然后你可以循环遍历年数组:
<% 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>
在控制器中:
@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`
散列的结构如下:
# { 2010: [<Result id:1>, <Result id:3>],
# 2012: [<Result id:2>],
# 2014: [<Result id:7>, <Result id:9>] }
在视图中:
@results_by_year.each do |year, results|
= year
- results.each do |result|
= result.id
= result.data
end