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
相关产品推荐
相关产品推荐

