Запрос помощи эксперта.
У меня есть таблица приложений, в которой есть метрики has_many.
В какой-то момент метрики будут иметь следующий вид записей.
{capture_time: "08: 00: 10.1234", metric_name: "log", metric_value: "OK", application_id: 1} {capture_time: "09: 00: 10.1234", metric_name: "process", metric_value: "KO", application_id: 1} {capture_time: "10: 00: 10.1234", metric_name: "process", metric_value: "OK ", application_id: 1}
{capture_time:" 08: 00: 10.1234 ", metric_name:" log ", metric_value:" OK ", application_id: 2} {capture_time:" 09: 00: 10.1234 ", metric_name: "process", metric_value: "OK", application_id: 2} {capture_time: "10: 00: 10.1234", metric_name: "process", metric_value: "KO", application_id: 2}
У меня есть больший цикл для приложений, и для каждого приложения я создаю кнопки для каждой метрики для этого приложения
<% applic.metric.uniq{|p|p.metric_name}.each do |m| %>
<%= link_to m.metric_name, metrics_path(m.application_id,metric_name: m.metric_name) , :class=>"btn btn-success",:role=>"button" %>
<% end %>
При нажатии любой кнопки этопоказывает мне записи только для этой метрики.Например, если я нажимаю на процесс, я вижу все записи этой метрики, в моем случае это 2 записи.
Так что пока здесь все нормально,Мне нужна помощь в два раза:
- Как определить последние метрики (основанные на времени захвата) для этого приложения, которое является KO, а затем использовать его для изменения класса в link_to внутри цикла.Примерно так:
<% applic.metric.uniq{|p|p.metric_name}.each do |m| %>
<%= link_to m.metric_name, metrics_path(m.application_id,metric_name: m.metric_name),:class=>"btn btn-success",:role=>"button" %>
<% end %>
Class => btn-danger, если последняя запись для этого показателя была KO, иначе btn-success
Тогда я бы хотел использовать комбинированные статусы метрик и изменить класс для всего поля Application1.Например, если какой-либо из процессов, журналов, счетчиков ошибок завершился неудачно, что означает, что любая из последних матриц любой из трех категорий - это KO, тогда весь блок Application1 должен иметь класс как «btn-danger»
вот так:
ОБНОВЛЕНИЕ 1: Большое спасибо @ sammms
Я попробовал предложение и создалследующее, но это все еще не решает мою проблему.
class Metric < ApplicationRecord
belongs_to :application
def isFailed(metric_value=nil)
metric_value == 'KO'
end
end
<% applic.metric.uniq{|p|p.metric_name}.each do |metric| %>
<%= link_to metric.metric_name, application_dashboard_metrics_path(appid:metric.application_id,metric_name: metric.metric_name),
{:class=>"btn #{metric.isFailed(metric.metric_value)? 'btn-danger':'btn-success' }",:role=>"button"} %>
<% end %>
работает интерполяция строк, так как в ней изменяется класс на основе значения метрики.Но проблема здесь заключается в уникальном бите.
applic.metric.uniq{|p|p.metric_name}.each
, поскольку я перебираю только уникальное имя_ метрики, это может быть тот, у которого metric_value в порядке.И, следовательно, когда он зацикливается, он фактически не находит KO для этой метрики.
Если я не использую uniq в цикле, тогда я вижу одну кнопку для каждой записи.что-то вроде ниже,
Это не то, что я хотел.
Я хотел иметь кнопку только один раз, для каждого метрического имени, затем изменитекласс на основе общего статуса всех записей для этой метрики.
Итак, когда у меня есть 100 записей для метрики процесса, я не хочу 100 кнопок, я хочу только одну кнопку процесса, но класс долженосновываться на том, является ли последнее значение metric_value KO.
ОБНОВЛЕНИЕ 2:
Я решил проблему следующим образом:
def isFailed(metric_name=nil)
p metric_name
#metric_value == 'KO'
Metric.where(metric_name:metric_name).order("capture_time DESC").first.metric_value == "KO"
end
Теперь мне нужно разобраться с частью 2.