请求专家帮助。
我有一个具有许多指标的应用程序表。
在某个时间点,指标将具有以下类型的记录。
{捕获时间:“ 08:00:10.1234”,度量名称:“ log”,度量值:“ OK”,application_id:1} {捕获时间:“ 09:00:10.1234”,度量名称:“进程”,度量值:“ KO”,application_id:1} {capture_time:“ 10:00:10.1234”,metric_name:“ process”,metric_value:“ OK”,application_id:1}
{捕获时间:“ 08:00:10.1234”,度量名称:“ log”,度量值:“ OK”,application_id:2} {捕获时间:“ 09:00:10.1234”,度量名称:“进程”,度量值:“确定”,应用程序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 else btn-成功
更新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确定为OK的那个。因此,当它循环时,它实际上找不到该度量的任何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部分。
答案 0 :(得分:0)
由于您位于ERB块<%=... %>
中,因此可以编写香草红宝石,它将被评估。这意味着您可以在传递给class
的字符串中使用插值,例如
class="#{'btn-danger' if metric.ko?}"
其中ko?
是Metric
中定义的方法,该方法将返回用于评估条件的布尔值。例如...
class Metric
def ko?
metric_value == 'KO'
end
end
对于第二部分,您可以使用相同的逻辑。创建一个CSS类,使您的框看起来像您想要的样子,然后在ERB类定义中使用字符串插值有条件地添加它。然后只需在Class上定义一个方法(我认为在这种情况下,您似乎想要应用程序类,以便您可以评估它的关联指标),然后使用该方法返回布尔值。