在rails的循环中使用link_to更改基于活动记录数据库查询的类?

问题描述 投票:1回答:1

请求专家帮助。

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

在某些时候,指标会有以下类型的记录。

{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

  1. 然后我想使用Metrices的组合状态并更改整个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的那个。因此,当它循环时,它实际上找不到该指标的任何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部分。

ruby-on-rails ruby ruby-on-rails-3 activerecord rails-activerecord
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.