Отобразить запрос суммы Ruby on Rails в виде сводной таблицы - PullRequest
0 голосов
/ 06 марта 2019

У меня есть следующий запрос:

Customer.joins(:orders).group(:Category, :Year).sum(:Amount)

=> {["Category1", 2018]=>54, 
    ["Category1", 2019]=>187, 
    ["Category2", 2017]=>43,
    ["Category2", 2018]=>84,
    ["Category2", 2019]=>239}

Я хотел бы вывести это в view.html.erb, как сводная таблица, например так:

Categories  |   2017   |  2018  |  2019  |
------------------------------------------
Category1   |          |  54    |  187   |
Category2   |   43     |  84    |  239   |

Обычно яможет сделать что-то подобное, но это невозможно:

<% @table.each do |r| %>
  <tr>
    <td><%= r.category %></td>
    <td><%= r.year %></td>
  </tr>

Как мне этого добиться?

У меня уже есть такие имена столбцов, но я думаю, что это слишком сложно:

@table.uniq { |fields, data|  [fields[1]] }.each do |v|
  @table_column_names << v[0][1]

1 Ответ

0 голосов
/ 06 марта 2019

1 => допустим, есть хеш x

x = {["Category1", 2018]=>54, 
    ["Category1", 2019]=>187, 
    ["Category2", 2017]=>43,
    ["Category2", 2018]=>84,
    ["Category2", 2019]=>239
}

2 => создать массив [[category, year, count]...]

category_year_counts = []

x.each do |key, value|
  category_year_counts << [key[0], key[1], value]
end
#=>[["Category1", 2018, 54], ["Category1", 2019, 187], ["Category2", 2017, 43], ["Category2", 2018, 84], ["Category2", 2019, 239]] 

3 => Вот оно -

<% x.each do |key, value| %>
  <tr>
    <td>categories</td>
    <%years = x.keys.map{|elm| elm[1]}.uniq%>
    <%years.each do |year|%>
      <td><%=year%></td>
    <%end%>
  <tr>
  <%categories_lists = x.keys.map{|elm| elm[0]}.uniq%>
  <%categories_lists.each do |category|%>
    <tr>
        <td><%=category%></td>
        <%years.each do |year|%>
           <%result= category_year_counts.select{|elm| elm[0].eql?(category) && elm[1].eql?(year)}.first%>
          <td><%=result.present? && result[2].present? ? result[2] : ""%></td>
        <%end%>     
    </tr>
  <%end%>
<%end%>

Может быть более удобный способ сделать это.

...