根据活动记录数据库查询更改类,并在rails中使用link_to循环?

时间:2019-02-24 20:22:25

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord rails-activerecord

请求专家帮助。

我有一个具有许多指标的应用程序表。

在某个时间点,指标将具有以下类型的记录。

{捕获时间:“ 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 %>

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 else btn-成功

enter image description here

  1. 然后,我想使用度量标准的组合状态并为整个Application1框更改Class。 例如,如果Process,Log,Errorcounts中的任何一个失败,这意味着3类中任何一个的最新矩阵均为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_name,因此它可能是metric_value确定为OK的那个。因此,当它循环时,它实际上找不到该度量的任何KO。

如果我不在循环中使用uniq,那么每条记录都会显示一个按钮。如下所示,

enter image description here

这不是我想要的。
我希望每个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部分。

1 个答案:

答案 0 :(得分:0)

由于您位于ERB块<%=... %>中,因此可以编写香草红宝石,它将被评估。这意味着您可以在传递给class的字符串中使用插值,例如 class="#{'btn-danger' if metric.ko?}" 其中ko?Metric中定义的方法,该方法将返回用于评估条件的布尔值。例如...

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

对于第二部分,您可以使用相同的逻辑。创建一个CSS类,使您的框看起来像您想要的样子,然后在ERB类定义中使用字符串插值有条件地添加它。然后只需在Class上定义一个方法(我认为在这种情况下,您似乎想要应用程序类,以便您可以评估它的关联指标),然后使用该方法返回布尔值。