Rails:从数据库中获取值的计数

时间:2017-09-13 14:36:38

标签: ruby-on-rails ruby

我的数据库中有一个名为“体验”的列,用户可以保存0-2岁,2-5岁,5-10岁,10岁以上的值。我的问题是如何计算这些值?我不是在寻找所有的总和,我正在尝试计算列中存在多少“2-5岁”值并在视图中将其呈现给用户。

因此,在视图中,用户将看到名为experience的数据库表列中的值,然后发布了多少个作业并包含该值。

体验:

0 - 2年(3)

2-5岁(15)

目前我在视图中执行此操作

<%= link_to "0-2 years", filtered_jobs_path(experience: '0-2 years', num_days_past: params[:num_days_past], search: params[:search]) %>
   (<%= Job.where(experience: '0-2 years').size %>)<br />

我正在阅读它最好使用size而不是count,因为如果数据库已经被加载,大小将不会再次调用数据库。我不确定我是否以最有效的方式执行此操作,可能我应该使用计数器缓存列?

以下是我目前如何进行设置的调用,看起来即使我正在使用.size

也不断查询数据库
   (0.1ms)  SELECT COUNT(*) FROM "jobs" WHERE "jobs"."experience" = ?  [["experience", "0-2 years"]]

   (0.1ms)  SELECT COUNT(*) FROM "jobs" WHERE "jobs"."experience" = ?  [["experience", "2-5 years"]]

   (0.1ms)  SELECT COUNT(*) FROM "jobs" WHERE "jobs"."experience" = ?  [["experience", "5-10 years"]]

   (0.1ms)  SELECT COUNT(*) FROM "jobs" WHERE "jobs"."experience" = ?  [["experience", "10+ years"]]

  Job Load (0.2ms)  SELECT  "jobs".* FROM "jobs" LIMIT ? OFFSET ?  [["LIMIT", 5], ["OFFSET", 0]]

   (0.1ms)  SELECT COUNT(*) FROM "jobs"

  CACHE (0.0ms)  SELECT COUNT(*) FROM "jobs"

2 个答案:

答案 0 :(得分:2)

Job.group(:experience).count

应该为您提供一个散列,其中包含经验字段的键和值,以及该字段的行数

<% Job.group(:experience).count.each do |name, count| %>
  <%= link_to name, filtered_jobs_path(experience: name, num_days_past: params[:num_days_past], search: params[:search]) %>
  (<%= count %>)
<% end %>

答案 1 :(得分:0)

您希望按经验进行分组,然后计算:

Job.group(:experience).count

那会返回一个哈希:

{
  '0-2 years' => 1,
  '10+ years' => 2,
  '2-5 years' => 1,
  '5-10 years' => 2
}

所以在你看来你可以这样写:

# in controller

@exp_names = ['0-2 years', '2-5 years', '5-10 years', '10+ years']
@exp_counts = Job.group(:experience).count

# in view

<% @exp_names.each do |name| %>
  <%= link_to name, filtered_jobs_path(experience: name, num_days_past: params[:num_days_past], search: params[:search]) %>
  (<%= @exp_counts[name] %>)
  <br>
<% end %>