UsersController的索引:
@users = current_user.other_users.where("first_name like ?", "%#{params[:q]}%")
1) 除了未检测到第一个字符外,搜索在文本字段中运行良好。
示例:如果我用"J"搜索"John",我不会得到任何结果,但如果我用了"o",我会得到我应该得到的"John"。
2) 我想知道你是如何在上面为last_name添加额外的搜索条件的。。。?我觉得有点像
.where("first_name like ? or last_name like ?", "%#{params[:q]}%")
会起作用,但没有。。。
感谢帮助!
我敢打赌,您正在使用Postgres作为数据库,其中LIKE子句区分大小写。在Postgres:中搜索不区分大小写
.where("first_name ILIKE ? or last_name ILIKE ?", "%#{params[:q]}%")
这个SO有很多背景:如何为MySQL和Postgres编写不区分大小写的查询?
其他替代方案:
- https://github.com/texticle/texticle
- 存储full_name的小写版本并在该字段上搜索
-
我不知道为什么这不匹配。也许您应该在参数
"first_name like '?'"
周围添加' '
-
我想你应该有两个参数:
.其中("first_name like?or last_name like","%#{params[:q]}%","%%{params[:q]}%")
没有检测到第一个字母的原因是where语句中的名字列和姓氏列前面有一个%nif。既然J
背后什么都没有,那就是%John%
不起作用的原因。
您需要同时查找前后语句。
这是可行的。
q1 = params[:q].to_s + '%'
q2 = '%' + q1
where(["first_name LIKE ? OR last_name LIKE ? OR first_name LIKE ? OR last_name LIKE", q1,q1,q2,q2])
然后在SQL语句中放入UNIQUE,使它们都是唯一的行。
无论如何,最好对这类内容使用全文搜索索引,因为LIKE操作不针对前操作和后操作(仅针对前操作)编制索引。这是假设您使用MySQL作为数据库后端。