轨与jQuery令牌输入:第一个字符搜索忽略
UsersController指数:轨与jQuery令牌输入:第一个字符搜索忽略
@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有很多背景:How do you write a case insensitive query for both MySQL and Postgres?
其他替代方案:
- https://github.com/texticle/texticle
- 店FULL_NAME的小写版本,并在该领域的搜索
这是做到了 - 谢谢!我还要感谢@davidrac在#2上的帮助。 – dmonopoly 2012-08-14 01:52:04
我不知道为什么这不匹配。也许你应该添加
' '
周围的参数:"first_name like '?'"
我想你应该在那里有两个参数:
。凡( “?FIRST_NAME喜欢或姓氏LIKE”,“%#{PARAMS [:q]}%“,”%#{params [:q]}%“)
1不好 - 把''放在'只是不让搜索工作。然而,2的作品很棒 - 非常感谢! (如果你想出另一个想法1,请让我知道) – dmonopoly 2012-08-02 16:17:45
第一个字母没有被检测到的原因是因为您有一个名字列的前面和后面在where语句中。所以,因为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作为数据库后端。
您使用的数据库是?也许(尽管我不知道为什么会出现这种情况,但它违背了我能找到的所有文档),搜索中的'%'字符不匹配零长度。这意味着''%J%“'不会匹配以J开头的名称,因为它需要前面有另一个字符。您的查询是否与名称中最后一个字符的字母匹配? – 2012-08-13 15:18:54
有趣的想法!我正在使用Postgres。查询成功匹配名称中最后一个字符的字母。 – dmonopoly 2012-08-13 18:24:17
如果你能匹配名字的最后一个字母,那么我的建议很可能不是问题的原因。但是你可以尝试从where子句中删除第一个'%',看看会发生什么。 – 2012-08-13 19:41:22