Запрос и отображение HTML-таблицы статистики производительности интернет-провайдера

У меня есть несколько измерений, и я хочу отобразить их в таких таблицах

ИзмеренияОператорбровиFTP DLFTP UL
РасположениеСобытиеДатаОператорв среднемминМаксимумв среднемминМаксимумв среднемминМаксимум
Verizon
USCell
T-Mobile

для каждого отображаемого измерения всегда есть 3 оператора

оператор фиксированное / определенное значение они ["Verizon", "USCell", "T-Mobile"]

мой текущий подход – использовать несколько циклов и использовать where пункт для достижения этого

measurements/index.html.erb

<table>
  <thead>
    <tr>
      <th colspan="3">Measurement</th>
      <th colspan="3">FTP DL</th>
      <th colspan="3">FTP UL</th>
      <th colspan="3">Browsing</th>
    </tr>
    <tr>
      <th>Location</th>
      <th>Event</th>
      <th>Date</th>
      <th>Event</th>
      <th>Average Browsing Speed (Mbps)</th>
      <th>Minimum Browsing Speed (Mbps)</th>
      <th>Maximum Browsing Speed (Mbps)</th>
      <th>Average FTP Download Speed (Mbps)</th>
      <th>Minimum FTP Download Speed (Mbps)</th>
      <th>Maximum FTP Download Speed (Mbps)</th>
      <th>Average FTP Upload Speed (Mbps)</th>
      <th>Minimum FTP Upload Speed (Mbps)</th>
      <th>Maximum FTP Upload Speed (Mbps)</th>
    </tr>
  </thead>
  <tbody>
    <% @measurements.each do |measurement| %>
      <% @operators.each do |operator| %>
        <tr>
          <td><%= measurement.location %></td>
          <td><%= measurement.event %></td>
          <td><%= measurement.date %></td>
          <td><%= operator %></td>
          <% if measurement.browsings.where(operator: operator).any? %>
            <td><%= measurement.browsings.where(operator: operator).first.avg %></td>
            <td><%= measurement.browsings.where(operator: operator).first.min %></td>
            <td><%= measurement.browsings.where(operator: operator).first.max %></td>
          <% else %>
            <td></td>
            <td></td>
            <td></td>
          <% end %>
          <% if measurement.ftp_dls.where(operator: operator).any? %>
            <td><%= measurement.ftp_dls.where(operator: operator).first.avg %></td>
            <td><%= measurement.ftp_dls.where(operator: operator).first.min %></td>
            <td><%= measurement.ftp_dls.where(operator: operator).first.max %></td>
          <% else %>
            <td></td>
            <td></td>
            <td></td>
            <td></td>
          <% end %>
          <% if measurement.ftp_uls.where(operator: operator).any? %>
            <td><%= measurement.ftp_uls.where(operator: operator).first.avg %></td>
            <td><%= measurement.ftp_uls.where(operator: operator).first.min %></td>
            <td><%= measurement.ftp_uls.where(operator: operator).first.max %></td>
          <% else %>
            <td></td>
            <td></td>
            <td></td>
          <% end %>
        </tr>
      <% end %>
    <% end %>
  </tbody>
</table>

Мне интересно, могу ли я избежать использования нескольких циклов и предложения where в моем коде для достижения этого?

потому что я думаю, что использование нескольких циклов и подход, рассматриваемый как плохая практика, не так ли?

Я думаю, так как у меня есть несколько повторений operator Я мог бы использовать это как группу или что-то в этом роде, я думаю о том, чтобы присоединиться ко всем своим has_many и сгруппируйте их, используя group_by operator но я еще не знаю, как это сделать (там нужно небольшое руководство, если это действительно возможно и хороший подход)

вот мой другой код

measurement.rb

class Measurement < ApplicationRecord
  has_many :ftp_uls, dependent: :destroy
  has_many :ftp_dls, dependent: :destroy
  has_many :browsings, dependent: :destroy
end

measurement_controller.rb

class MeasurementsController < ApplicationController
  before_action :authenticate_user!, only: [:index, :show]
  before_action :set_measurement, only: %i[ show edit update destroy ]

  def index
    @measurements = Measurement.all
    @operators = ["Verizon", "USCell", "T-Mobile"]
  end
end

schema.rb

ActiveRecord::Schema.define(version: 2021_08_17_062327) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "browsings", force: :cascade do |t|
    t.bigint "measurement_id", null: false
    t.string "operator"
    t.decimal "avg"
    t.decimal "min"
    t.decimal "max"
    t.index ["measurement_id"], name: "index_browsings_on_measurement_id"
  end

  create_table "ftp_dls", force: :cascade do |t|
    t.bigint "measurement_id", null: false
    t.string "operator"
    t.decimal "avg"
    t.decimal "min"
    t.decimal "max"
    t.index ["measurement_id"], name: "index_ftp_dls_on_measurement_id"
  end

  create_table "ftp_uls", force: :cascade do |t|
    t.bigint "measurement_id", null: false
    t.string "operator"
    t.decimal "avg"
    t.decimal "min"
    t.decimal "max"
    t.index ["measurement_id"], name: "index_ftp_uls_on_measurement_id"
  end

  create_table "measurements", force: :cascade do |t|
    t.string "location"
    t.string "event"
    t.date "date"
  end
end

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *