【问题标题】:Looping Multiple Arrays by year按年循环多个数组
【发布时间】:2015-09-02 02:15:15
【问题描述】:

我正在查看多个数组,但无法根据年份在表格中对齐它们。目前数据与相应年份不一致,如果任何年份都存在数据,则只需将数据放在第一行,然后将“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')

【问题讨论】:

  • 请在表格中提及您想要的数据格式和输出格式。
  • 我在获取问题想要的内容时遇到了一些麻烦,您能否写下您明确不是查询的数据以及您想要的文本格式。
  • @DollarChills,我在下面为您的问题提出了解决方案。我希望我做对了。让我知道它是否适合您的需求。
  • 您是否尝试在 SQL 中获取所有结果(无论年份是什么),然后执行results.group_by(&amp;:year)?它将结果分组到一个散列中,其中键是年份,值是包含今年匹配的每个结果的数组。

标签: mysql ruby-on-rails ruby-on-rails-3.2


【解决方案1】:

我想你可以试试这个方法。在这种情况下,您无需检查空白值。我希望@a 包含您所有可用的年份,否则您需要将所有年份合并为一个循环

<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 数组:

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

【讨论】:

    【解决方案2】:

    在你看来,你可能是这个意思:

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

    【讨论】:

    • 感谢 Dimakura,我已经尝试过这种方法,但没有运气。我已经在控制器中按年份分组了。
    • 我在“b.id”开始的地方得到未定义的方法“id”。
    • @DollarChills 你能告诉我这些数组是什么或如何得到的吗
    • 我通过一个简单的表单获取它们,该表单有一些下拉选项。
    • 您有@a@b 等的公式。它们仍然有效吗?
    【解决方案3】:

    在控制器中:

    @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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多