You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails用户搜索功能如何实现同一条查询同时匹配first_name和last_name

解决方案

直接修改你控制器search方法中的查询语句即可,在原有条件基础上通过OR关联last_name的模糊匹配逻辑,修改后的代码如下:

def search
  if params[:search].blank?
    redirect_to users_path and return
  else
    @parameter = params[:search].downcase
    # 新增OR条件匹配last_name字段,复用同一个search参数即可
    @results = User.all.where("lower(first_name) LIKE :search OR lower(last_name) LIKE :search", search: "%#{@parameter}%")
  end
end

修改后执行时生成的SQL语句会自动关联两个字段的匹配逻辑:

User Load (xxxms)  SELECT "users".* FROM "users" WHERE (lower(first_name) LIKE '%laura%' OR lower(last_name) LIKE '%laura%')

可选优化:更规范的Rails原生写法

如果不想手动编写原始SQL片段,也可以用Rails自带的Arel语法实现同样效果,兼容性和可维护性更强:

def search
  if params[:search].blank?
    redirect_to users_path and return
  else
    @parameter = params[:search].downcase
    user_table = User.arel_table
    @results = User.where(
      user_table[:first_name].lower.matches("%#{@parameter}%")
      .or(user_table[:last_name].lower.matches("%#{@parameter}%"))
    )
  end
end

你的搜索表单和结果页代码不需要做任何修改,调整控制器逻辑后就能同时匹配first_name和last_name的搜索关键词。

内容的提问来源于stack exchange,提问作者Bj Petrie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 22:06:01