如何在Rails 5.1中用Ransack Gem实现年月下拉筛选?
嘿,我来帮你搞定这个Ransack筛选的问题~其实你不需要用到grouping_fields和condition_fields,这俩是用来构建复杂的多条件组(比如AND/OR嵌套)的,而你的需求是简单的年份+月份筛选,直接用Ransack提供的日期字段predicate就够了,写起来更简洁。
第一步:控制器初始化搜索对象
首先在你的StatisticsController的index动作里,初始化Ransack的搜索对象,假设你的职位模型是Job,且有一个记录发布日期的字段(比如posted_at,你可以换成自己实际的字段,比如created_at):
# app/controllers/statistics_controller.rb def index @search = Job.ransack(params[:q]) # 如果是统计数据,你可以在这里处理查询结果,比如分组统计 @statistics = @search.result(distinct: true).group_by { |job| [job.posted_at.year, job.posted_at.month] } end
第二步:视图里的筛选表单
接下来修改你的视图,直接用Ransack的select helper绑定对应的年份和月份predicate,注意把提交按钮放在表单内部(你之前的代码把submit写到form外面了,这会导致提交无效):
# app/views/statistics/index.html.erb <%= search_form_for @search do |f| %> <div class="filter-row"> <%= f.label :posted_at_year_eq, "年份" %> <!-- 生成2011-2018的年份选项,可选添加include_blank让用户可以不筛选年份 --> <%= f.select :posted_at_year_eq, (2011..2018).to_a, include_blank: "请选择年份" %> </div> <div class="filter-row"> <%= f.label :posted_at_month_eq, "月份" %> <!-- 用Rails内置的英文月份缩写,value是月份数字(1-12),Ransack的month_eq会识别数字 --> <%= f.select :posted_at_month_eq, Date::ABBR_MONTHNAMES.compact.each_with_index.map { |name, idx| [name, idx + 1] }, include_blank: "请选择月份" %> </div> <%= f.submit "筛选", class: "btn btn-primary" %> <% end %> <!-- 下面是你的统计数据展示区域 --> <% @statistics.each do |(year, month), jobs| %> <h3><%= year %>年 <%= Date::ABBR_MONTHNAMES[month] %></h3> <p>职位数量:<%= jobs.count %></p> <% end %>
关键说明
- 字段替换:把
posted_at换成你模型中实际存储日期的字段,比如created_at或者published_at - predicate含义:
posted_at_year_eq表示匹配“发布日期的年份等于选中值”,posted_at_month_eq表示匹配“发布日期的月份等于选中值”,Ransack会自动帮你生成对应的SQL查询 - 可选空白选项:
include_blank参数是可选的,如果用户不需要筛选某个条件,可以留空,此时Ransack会忽略该条件 - 条件逻辑:默认情况下,Ransack会把多个条件用AND连接,也就是同时满足年份和月份的筛选,正好符合你的需求
如果之后需要更复杂的筛选(比如年份范围、OR条件),再考虑用grouping_fields,现在这个写法完全能满足你的需求啦~
内容的提问来源于stack exchange,提问作者Trinity76
相关产品推荐
相关产品推荐

