我正在尝试创建一个主要按日期显示每个相应字段的数字的表。我只有一个这个模型
查看:
<table class="table-table-verif">
<thead class="fixed_headers">
<tr id = "thead-title">
<th>Date</th>
<th># True Positive</th>
<th># True Negative</th>
<th># False Positive</th>
<th># False Negative</th>
</tr>
</thead>
<tbody>
<% @verification.each do |s| %>
<tr id="thead-value">
// what to do here?
</tr>
<% end %>
</tbody>
</table>
我想在我的控制器中调用这些查询。
控制器:
def date
@verification = Verification.group(:Date).where("Findings = ? or Findings = ?", 'False Positive','False Negative').order(Date: :asc).count
end
def number_true_positive
Verification.group(Date).where("Findings = ?", 'True Positive').order(Date: :asc).count
end
def number_false_positive
Verification.group(:Date).where("Findings = ?", 'False Positive').order(Date: :asc).count
end
def number_true_negative
Verification.group(:Date).where("Findings = ?", 'True Negative').order(Date: :asc).count
end
def number_false_negative
Verification.group(:Date).where("Findings = ?", 'False Negative').order(Date: :asc).count
end
每列应计算相应记录的数量,并根据日期将数字放在各自的<th>
上。
什么是更好的方法?
答案 0 :(得分:2)
我在代码中看到很多重复,您可以为每个子查询创建scopes
,并且可以有多个组合。
在verification.rb
,
scope :date_grouped, -> { group(:Date) }
scope :falsy, -> { where("Findings = ? or Findings = ?", 'False Positive','False Negative') }
scope :truthy, -> { where("Findings = ? or Findings = ?", 'True Positive','True Negative') }
scope :findings_by, -> (value) { where(Findings: value) }
scope :date_asc, -> { order(Date: :asc) }
现在您可以根据需要调用它们。
e.g。
<%= Verification.date_grouped.falsy.date_asc %>
<%= Verification.date_grouped.truthy.date_asc %>
<%= Verification.date_grouped.findings_by('True Positive').date_asc %>