Rails应用求职搜索功能多表查询:如何实现城市与行业字段查询
实现多条件关联搜索的方案
1 修复表单已知错误
当前行业下拉选框的默认值配置错误,选中后刷新页面无法保留选中状态,修改对应代码即可:
# 把原来行业下拉的这行 = f.select :industry, options_for_select(@industry.map {|c| [c, c]}, params[:city]), class:"form-select bg-light h-100" # 修改为 = f.select :industry, options_for_select(@industry.map {|c| [c, c]}, params[:industry]), class:"form-select bg-light h-100"
2 修改控制器查询逻辑
基于常规关联关系(ApplyJob belongs_to Job,Job belongs_to City、Job belongs_to Industry),通过动态拼接查询条件+关联表筛选实现多字段搜索,修改后的applies方法代码如下:
def applies @city = City.all.map(&:name) @industry = Industry.all.map(&:name) # 初始化基础查询 @apply_jobs = ApplyJob.includes(:job, cv_attachment: :blob) # 动态拼接筛选条件 if applied_params[:email].present? @apply_jobs = @apply_jobs.where(email: applied_params[:email]) end if applied_params[:city].present? @apply_jobs = @apply_jobs.joins(job: :city).where(cities: { name: applied_params[:city] }) end if applied_params[:industry].present? @apply_jobs = @apply_jobs.joins(job: :industry).where(industries: { name: applied_params[:industry] }) end # 统一添加分页逻辑 @apply_jobs = @apply_jobs.page(params[:page]).per(Job::JOB_PER_PAGE) end
逻辑说明
- 用动态条件拼接的方式,只有当对应搜索字段有输入/选中时才会添加对应筛选规则,避免空参数导致查询结果为空
joins(job: :city)表示关联apply_jobs对应的job表,再关联job对应的city表- 关联表筛选时
where里的表名要用复数形式(cities、industries),符合Rails默认命名规范 - 保留了原有的
includes预加载逻辑,不会产生N+1查询问题
内容的提问来源于stack exchange,提问作者Hà Mai
相关产品推荐
相关产品推荐

