【问题标题】:Rails - user selected filtersRails - 用户选择的过滤器
【发布时间】:2014-12-05 01:04:23
【问题描述】:

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

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

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

但我真的不知道这是否正确,或者如何继续。任何帮助将不胜感激。

【问题讨论】:

  • 在您的控制器索引中,您必须添加一个 if。 @shop = Shop.select(params[:year]) 如果 params[:year] 。并在您的 form_for 方法中: :get
  • 您好,感谢您的评论。但这仍然没有给我实际的过滤器,只是一个空表单。
  • 你的意思是你得到一个空表格,然后你输入一些东西并点击过滤器,你仍然得到一个空表格?您是否检查了控制台日志以查看是否运行了任何查询,您是否尝试 并查看您是否在浏览器中看到商店列表作为错误消息?

标签: ruby-on-rails forms activerecord


【解决方案1】:

为您的表创建一个视图可能比使用年份范围的该视图的单独模型更简洁

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

比在你的控制器中你可以拥有:

ShopStats.for_year params[:year]

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2016-10-10
    • 1970-01-01
    • 2019-01-31
    • 2018-04-08
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多