Rails中如何将视图的current_season变量传递给控制器过滤数据
Rails控制器过滤季度车辆的实现方案
首先修正你现有代码的问题:
你在Car模型中定义的sample实例方法存在变量未定义问题:方法内的car可直接用self指代当前实例,入参current_season和你使用的season变量名不一致,修正后的实例方法参考:
def sold_in_season?(current_season) # 若sold_month存的是数字月份,需先转换为季度:(self.sold_month / 3.0).ceil == current_season self.sold_month == current_season end
但用实例方法遍历过滤属于内存层面过滤,数据量大时性能较差,更推荐用ActiveRecord Scope在数据库层面完成过滤,在Car模型中添加如下Scope:
scope :filter_by_season, ->(season) { where(sold_month: season) } # 若需要按月转季度过滤的版本: # scope :filter_by_season, ->(season) { where("CEIL(sold_month / 3.0) = ?", season) }
不同场景下传递current_season的解决方案
根据你视图中current_season的来源,选择对应方案:
场景1:current_season是用户可选择的筛选参数
通过URL查询参数传递即可,实现步骤:
- 视图中添加季度筛选表单,提交到Home控制器的show路径:
<%= form_tag home_path, method: :get do %> <%= select_tag :current_season, options_for_select([["Q1", 1], ["Q2", 2], ["Q3", 3], ["Q4", 4]], params[:current_season]), include_blank: "全部季度" %> <%= submit_tag "筛选" %> <% end %>
- 控制器中接收参数完成过滤:
def show authorize Car current_season = params[:current_season] @cars = policy_scope(Car) @cars = @cars.filter_by_season(current_season) if current_season.present? end
场景2:current_season是系统默认的当前季度
不需要从视图传递,直接在控制器中计算即可:
def show authorize Car # 默认取当前自然季度,可根据你的业务规则调整计算逻辑 current_season = Date.today.quarter @cars = policy_scope(Car).filter_by_season(current_season) end
场景3:current_season是用户个性化的存储值
如果current_season是存在Session、当前用户属性或者Cookie中的值,直接在控制器中读取即可:
def show authorize Car # 示例:从session中取,也可替换为current_user.prefer_season等逻辑 current_season = session[:current_season] || Date.today.quarter @cars = policy_scope(Car).filter_by_season(current_season) end
内容的提问来源于stack exchange,提问作者Sara Lins
相关产品推荐
相关产品推荐

