请求专家帮助。
我有一个具有多个指标的应用程序表。
在某些时候,指标会有以下类型的记录。
{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条记录。
所以直到这里它的罚款。我正在寻求帮助的是两个折叠:
<% 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
更新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_name,所以它可能是具有metric_value的那个。因此,当它循环时,它实际上找不到该指标的任何KO。
如果我不在循环中使用uniq,那么我会看到每个记录的一个按钮。类似下面的东西,
这不是我想要的。 我希望每个metric_name只有一个按钮,然后根据该指标的所有记录的集合状态更改类。
所以,当我有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部分。
因为你在ERB块<%=... %>
里面,你可以写香草红宝石,它将被评估。这意味着您可以在传递给class
的字符串中使用插值,例如class="#{'btn-danger' if metric.ko?}"
其中ko?
是Metric
中定义的方法,它将返回用于评估您的状况的布尔值。例如...
class Metric
def ko?
metric_value == 'KO'
end
end
对于第二部分,您可以使用相同的逻辑。创建一个CSS类,使您的框看起来像您希望它看起来的样式,然后在ERB类定义中使用字符串插值有条件地添加它。然后在类上定义一个方法(我认为在这种情况下你会想要应用程序类,因此你可以评估它的相关指标)并使用它来返回一个布尔值。