Rails - 用户选择的过滤器

时间:2014-12-05 01:04:24

标签: ruby-on-rails forms activerecord

我有一个模型商店,数据库包含属性:商店名称,商店开业年份,总销售额(以及更多)。我已经对这些数据做了一些统计,结果就是这个表:

enter image description here

现在,我想要的是让用户选择/输入年份,并且应用程序仅显示该年份的以下数据(而不是整个表格)

我的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 %>

但我真的不知道这是对的,还是如何继续。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

为您的表创建一个视图可能更清晰,而且该视图的年度范围具有单独的模型

class ShopStats < ActiveRecord::Base
   scope :for_year, ->(year) { where(:year => year)}
end

,而不是你的控制器,你可以:

ShopStats.for_year params[:year]