У меня есть несколько измерений, и я хочу отобразить их в таких таблицах
Измерения | Оператор | брови | FTP DL | FTP 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