Изменить класс на основе активной записи базы данных запроса с link_to в цикле в рельсах? - PullRequest
0 голосов
/ 24 февраля 2019

Запрос помощи эксперта.

У меня есть таблица приложений, в которой есть метрики 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 %>

enter image description here

При нажатии любой кнопки этопоказывает мне записи только для этой метрики.Например, если я нажимаю на процесс, я вижу все записи этой метрики, в моем случае это 2 записи.

enter image description here

Так что пока здесь все нормально,Мне нужна помощь в два раза:

  1. Как определить последние метрики (основанные на времени захвата) для этого приложения, которое является 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

enter image description here

Тогда я бы хотел использовать комбинированные статусы метрик и изменить класс для всего поля Application1.Например, если какой-либо из процессов, журналов, счетчиков ошибок завершился неудачно, что означает, что любая из последних матриц любой из трех категорий - это KO, тогда весь блок Application1 должен иметь класс как «btn-danger»

вот так:
enter image description here

ОБНОВЛЕНИЕ 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 в цикле, тогда я вижу одну кнопку для каждой записи.что-то вроде ниже,

enter image description here

Это не то, что я хотел.
Я хотел иметь кнопку только один раз, для каждого метрического имени, затем изменитекласс на основе общего статуса всех записей для этой метрики.

Итак, когда у меня есть 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.

1 Ответ

0 голосов
/ 25 февраля 2019

Поскольку вы находитесь внутри блока ERB <%=... %>, вы можете написать ванильный рубин, и он будет оценен.Это означает, что вы можете использовать интерполяцию внутри строки, которую вы передаете class, например, class="#{'btn-danger' if metric.ko?}", где ko? - это метод, определенный в Metric, который будет возвращать логическое значение, используемое для оценки вашего состояния.например ...

class Metric
  def ko?
    metric_value == 'KO'
  end
end

Для второй части вы можете использовать ту же логику.Создайте класс CSS, который будет выглядеть так, как вы хотите, а затем условно добавьте его, используя интерполяцию строк в определении класса ERB.Затем просто определите метод для класса (я думаю, это звучит так, как будто вы хотите, чтобы класс приложения в этом случае, чтобы вы могли оценить связанные с ним метрики), и используйте его для возврата логического значения.

...