输入jquery令牌的rails:搜索中忽略的第一个字符



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的小写版本并在该字段上搜索
  1. 我不知道为什么这不匹配。也许您应该在参数"first_name like '?'" 周围添加' '

  2. 我想你应该有两个参数:

.其中("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作为数据库后端。

最新更新