我有一个模型商店,数据库包含属性:商店名称,商店开业年份,总销售额(以及更多)。我已经对这些数据做了一些统计,结果就是这个表:
现在,我想要的是让用户选择/输入年份,并且应用程序仅显示该年份的以下数据(而不是整个表格)
我的shop.rb表格部分:
class Shop < ActiveRecord::Base
belongs_to :opened
def self.percentile(values, percentile)
values_sorted = values.sort
k = (percentile*(values_sorted.length-1)+1).floor - 1
f = (percentile*(values_sorted.length-1)+1).modulo(1)
return values_sorted[k] + (f * (values_sorted[k+1] - values_sorted[k]))
end
def self.median_by_year
arr ||= []
years = Shop.distinct.pluck(:year).sort
years.each do |yr|
sales = Shop.where(year: yr).pluck(:items_sold)
perc = percentile(sales, 0.5)
arr << perc.to_i
end
return arr
end
end
我的控制员:
class ShopsController < ApplicationController
def index
@count = Shop.count
@sales_average = Shop.average(:items_sold).to_i
@sold = Shop.pluck(:items_sold)
@top_twenty_sales_average = Shop.percentile(@sold, 0.80).to_i
@bottom_twenty_sales_average = Shop.percentile(@sold, 0.20).to_i
@median = Shop.percentile(@sold, 0.50).to_i
@average_sales_by_year = Shop.select('year, count(names) as count').group('year').order('year').average('items_sold')
@min_sales_by_year = Shop.select('year, count(names) as count').group('year').order('year').minimum('items_sold')
@med = Shop.median_by_year
@table = @average_sales_by_year.zip@med.zip@min_sales_by_year
end
最后在视图文件中的表
<table>
<thead>
<tr>
<th>Year</th>
<th>Average sales</th>
<th>Median sales</th>
<th>Min sales</th>
</tr>
</thead>
<tbody>
<% @table.each do |avg, med| %>
<tr>
<td><%= avg[0] %></td>
<td><%= avg[1].to_i.to_s %></td>
<td><%= med[0] %></td>
<td><%= med[1][1] %></td>
</tr>
<% end %>
</tbody>
</table>
为了创建过滤器我尝试了一些基于类似SO问题的东西,但这是我的第一个应用程序,所以基本上我不太了解知道该怎么做。到目前为止,我试图将其添加到模型中:
def self.by_year(selected_year=nil)
if year
where(year: selected_year)
else
scoped
end
end
这个给控制器:
@shops = Shop.select(params[:year])
最后在视图中:
<%= form_tag url: shops_path do %>
<%= select_tag :year %>
<%= submit_tag 'Filter' %>
<% end %>
但我真的不知道这是对的,还是如何继续。任何帮助将不胜感激。
答案 0 :(得分:1)
为您的表创建一个视图可能更清晰,而且该视图的年度范围具有单独的模型
class ShopStats < ActiveRecord::Base
scope :for_year, ->(year) { where(:year => year)}
end
,而不是你的控制器,你可以:
ShopStats.for_year params[:year]