我在表中对齐多个变量时遇到问题。我想匹配每列中的年份并显示数据(如果存在),如果不显示' 0'。我附上了最新的图片,列d的数据应该是在2011年。
表
<% @a.zip(@b, @c, @d) do |a, b, c, d| %>
<tr>
<td><%= a.year %></td>
<td><% if a.nil? %>0<% else %><%= a.id %><% end %></td>
<td><% if a.nil? %>0<% else %><%= "%.2f" % (a.avg/227) %><% end %></td>
<td><% if b.nil? %>0<% else %><%= b.id %><% end %></td>
<td><% if b.nil? %>0<% else %><%= "%.2f" % (b.avg/227) %><% end %></td>
<td><% if c.nil? %>0<% else %><%= c.year %> <%= c.id %><% end %></td>
<td><% if c.nil? %>0<% else %><%= "%.2f" % (c.avg/227) %><% end %></td>
<td><% if d.nil? %>0<% else %><%= d.id %><% end %></td>
<td><% if d.nil? %>0<% else %><%= "%.2f" % (d.avg/227) %><% end %></td>
</tr>
<% end %>
控制器
@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('results.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('results.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('results.year').where('data > 0').select('AVG(data) AS data, year as year, COUNT(id) AS id').where('id = ?', '2').order('year ASC')
答案 0 :(得分:1)
您的@d
数组可能只有一个元素(2011年数据)。
当你zip
与其他更大的数组一起使用时,该数据与其他2007年的结果相关联。
例如:
2.1.5 :001 > a = [1,2,3]
=> [1, 2, 3]
2.1.5 :002 > b = [4,5,6]
=> [4, 5, 6]
2.1.5 :003 > c = [7]
=> [7]
2.1.5 :004 > a.zip(b,c)
=> [[1, 4, 7], [2, 5, nil], [3, 6, nil]]
您需要按年查询数据库,而不是仅仅询问ID可用的数据。