使用jquery token-input的rails:在搜索中忽略第一个字符

时间:2012-08-02 14:22:33

标签: jquery ruby-on-rails forms jquery-tokeninput

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]}%")

会起作用,但它不会......

帮助表示赞赏!

3 个答案:

答案 0 :(得分:3)

我打赌你使用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?

其他替代方案:

答案 1 :(得分:1)

  1. 我不确定为什么这不匹配。也许您应该在参数' '

  2. 周围添加"first_name like '?'"
  3. 我认为你应该有两个参数:

  4. .where(“first_name like?或last_name like?”,“%#{params [:q]}%”,“%#{params [:q]}%”)

答案 2 :(得分:0)

未检测到第一个字母的原因是因为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作为数据库后端。