我的数据库中有一个名为“体验”的列,用户可以保存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"
答案 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 %>